自定义字符串转换为周几和指定日期格式

简介: 自定义字符串转换为周几和指定日期格式
日期转换为今天
完全自定义绝对日期数字字符串转化为指定日期格式
自定义绝对日期数字字符串转化为今天,明天,昨天,周几

NSString+Extension.h

#import <Foundation/Foundation.h>
@interface NSString (Extension)
- (NSString *)currentDate;
- (NSString *)getWeekDate;
@end

NSString+Extension.m

#import "NSString+Extension.h"
@implementation NSString (Extension)
-(BOOL)leapYear : (long)currentday
{
    if(currentday % 400 == 0)
    {
        return YES;
    }
    else if((currentday % 100 != 0) && (currentday % 4 == 0))
    {
        return YES;
    }
    else
    {
        return NO;
    }
}
#pragma mark - 把绝对时间转换为年/月/日格式的日期字符串
-(NSString *)currentDate
{
    if([self longLongValue] < 0)
    {
        return @"未知时间";
    }

    long long  dateDistace = ([self longLongValue]/1000 + 8*3600)/86400;
    long long n = 0;
    long i,j,k,m;
    long month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    NSMutableDictionary *dic = [self getStartDayWithminDistace:dateDistace];
    i = [dic[@"startDay"] longValue];
    n = [dic[@"startValue"] longLongValue];
    for(j = 1, k = 1; (n <= dateDistace) && (i < 3000); i++)
    {
        for(j = 1; j <= 12 ; j++)
        {
            m = month[j - 1];
            for(k = 1; k <= m; k++)
            {
                n++;
                if(n == dateDistace)
                {
                    return  [NSString stringWithFormat:@"%ld/%ld/%ld", i, j,k];
                }
            }

            if((j == 2) && [ self leapYear: i])
            {
                n++;
                if(n == dateDistace)
                {
                    return  [NSString stringWithFormat:@"%ld/%ld/%ld", i, j,k];
                }
            }
        }
    }

    return  nil;
}

#pragma mark - 把绝对时间转换为今天,昨天,明天,周几
-(NSString *)getWeekDate
{
    if([self longLongValue] < 0)
    {
        return @"未知时间";
    }
    long long nowTime = (long long)[[NSDate date] timeIntervalSince1970] + 8*3600;
//    //测试代码
//    long long  minDistace = ([self longLongValue]/1000 + 8*3600 + 1*24*3600)/86400;
    //注意Java服务器获取到的时间是精确到毫秒的,苹果获取到的时间默认是精确到秒,若想得到毫秒需要乘以1000,反之要除以1000;获取到的绝对时间都是以零时区的时间为准,所以北京要加八个小时时间
    long long  minDistace = ([self longLongValue]/1000 + 8*3600)/86400;
    long long  maxDistace = nowTime/86400;
    BOOL isOverNow = minDistace > maxDistace;
    if(isOverNow)
    {
        long long temp = minDistace;
        minDistace = maxDistace;
        maxDistace = temp;
    }

    long long n = 0;
    long i,j,k,m,interval;
    interval = 0;
    long month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    NSMutableDictionary *dic = [self getStartDayWithminDistace:minDistace];
    i = [dic[@"startDay"] longValue];
    n = [dic[@"startValue"] longLongValue];
    for(j = 1, k = 1; (n <= maxDistace) && (i < 3000); i++)
    {
        for(j = 1; j <= 12 ; j++)
        {
            m = month[j - 1];
            for(k = 1; k <= m; k++)
            {
                n++;
                if(n == minDistace)
                {
                    interval++;
                }

                if(n == maxDistace)
                {
                    return [self getWeekDatValueWithIsOverNow:isOverNow interval:interval];
                }
                else if(interval > 0)
                {
                    interval++;
                }
            }

            if((j == 2) && [ self leapYear: i])
            {
                n++;
                if(n == minDistace)
                {
                    interval++;
                }

                if(n == maxDistace)
                {
                    return [self getWeekDatValueWithIsOverNow:isOverNow interval:interval];
                }
                else if(interval > 0)
                {
                    interval++;
                }
            }
        }
    }

    return  nil;
}

-(NSMutableDictionary *)getStartDayWithminDistace:(long long)minDistace
{
    NSMutableDictionary *dic = [NSMutableDictionary dictionary];
    if(minDistace >= 17167)
    {
        [dic setSafeObject:@"2017" forKey:@"startDay"];
        [dic setSafeObject:@"17167" forKey:@"startValue"];
    }
    else if(minDistace >= 16436)
    {
        [dic setSafeObject:@"2015" forKey:@"startDay"];
        [dic setSafeObject:@"16436" forKey:@"startValue"];
    }
    else if(minDistace >= 14610)
    {
        [dic setSafeObject:@"2010" forKey:@"startDay"];
        [dic setSafeObject:@"14610" forKey:@"startValue"];
    }
    else if(minDistace >= 10957)
    {
        [dic setSafeObject:@"2000" forKey:@"startDay"];
        [dic setSafeObject:@"10957" forKey:@"startValue"];
    }
    else
    {
        [dic setSafeObject:@"1970" forKey:@"startDay"];
        [dic setSafeObject:@"0" forKey:@"startValue"];
    }
    return dic;
}

-(NSString *)getWeekDatValueWithIsOverNow:(BOOL)isOverNow
                                 interval:(NSInteger)interval
{
    NSDate *inputDate = [NSDate date];
    NSArray *weekdays = [NSArray arrayWithObjects:[NSNull null],@"周日", @"周一", @"周二", @"周三", @"周四", @"周五", @"周六", nil];

    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];

    NSTimeZone *timeZone = [[NSTimeZone alloc] initWithName:@"Asia/Shanghai"];

    [calendar setTimeZone: timeZone];

    NSCalendarUnit calendarUnit = NSCalendarUnitWeekday;
    /*注意经过测试,就是你把这个日期(inputDate)置为以前的时间,通过[calendar components:calendarUnit fromDate:inputDate]你得到的theComponents.weekday也是今天所的周几,如:今天是周五,theComponents.weekday为5,和inputDate无关。所以只有你自己实现和今天的差的天数来确定具体哪天是周几才正确*/
    NSDateComponents *theComponents = [calendar components:calendarUnit fromDate:inputDate];
    NSLog(@"inputDate:%@, --%@", inputDate, [weekdays objectAtIndex:theComponents.weekday]);

    if(interval == 1)
    {
        return @"今天";
    }
    else if(interval == 2)
    {
        if(isOverNow)
        {
            return @"明天";
        }
        else
        {
            return @"昨天";
        }
    }
    else
    {
        NSInteger weekdayIndex = theComponents.weekday;
        NSInteger  num = (interval - 1)/7 + 1;
        if(isOverNow)
        {
            weekdayIndex = (num*7 + weekdayIndex + (interval - 1))%7;
        }
        else
        {
            weekdayIndex = (num*7 + weekdayIndex - (interval - 1))%7;
        }

        if(weekdayIndex == 0)
        {
            weekdayIndex = 7;
        }
        return [weekdays objectAtIndex:weekdayIndex];
    }
}
@end

使用例子:

先包含头文件

#import "NSString+Extension.h"

代转换字符串如:@”1490215716000”

如你的时间是精确到秒的请先乘以1000后转化为字符串调用,因为java服务器保存的时间默认都是精确到毫秒,而苹果系统默认都是精确到秒,毫秒数都是在小数点后。

使用时调用

    NSString *time = [NSString stringWithFormat:@"%lld", (long long)[[NSDate date] timeIntervalSince1970]*1000];
    NSLog(@"日期:%@", [time getWeekDate]);
目录
相关文章
|
12月前
|
存储 弹性计算 安全
阿里云服务器ECS详解:云服务器是什么,云服务器优势和应用场景及价格参考
云服务器ECS是阿里云众多云产品中,最受用户关注的产品,阿里云服务器提供多样化的计算能力,支持x86、Arm架构,涵盖CPU、GPU等多种服务器类型,满足各种用户需求。本文为大家详细介绍阿里云服务器是什么?云服务器的优势和应用场景,以及最新价格情况,以供大家参考。
|
数据采集 传感器 监控
如何在LabVIEW中使用FPGA模块
如何在LabVIEW中使用FPGA模块
636 1
|
11月前
|
存储 安全 Java
如何优雅地回答HashSet与HashMap的区别?看这里!
哈喽,大家好!我是小米,29岁程序员。本文聚焦Java开发中经典的面试题——HashSet和HashMap的区别。HashSet基于HashMap实现,存储唯一值;HashMap存储键值对。两者在数据结构、使用场景、操作方法等方面有显著差异。HashSet无序且依赖元素的hashCode和equals方法保证唯一性,而HashMap需注意线程安全问题。掌握这些知识点,助你轻松应对面试。更多技术干货,欢迎关注我的微信公众号“软件求生”。
353 4
|
12月前
|
存储 监控 安全
防止证书被伪造
防止证书被伪造
223 10
|
11月前
|
机器学习/深度学习 数据采集 DataWorks
DataWorks使用感受
DataWorks是功能全面的数据处理平台,涵盖数据清洗、特征工程、数据可视化等,性能优越,适合大规模数据处理。其界面简洁,便于任务开发与管理。但产品开通流程繁琐,价格体系不透明,部分高级功能文档不足,新版Notebook版本管理和Copilot智能助手有待优化。总体而言,DataWorks表现优秀,期待未来改进。
|
11月前
提升个人工作技能
提升个人工作技能
1172 6
|
存储 缓存 C语言
【c++】动态内存管理
本文介绍了C++中动态内存管理的新方式——`new`和`delete`操作符,详细探讨了它们的使用方法及与C语言中`malloc`/`free`的区别。文章首先回顾了C语言中的动态内存管理,接着通过代码实例展示了`new`和`delete`的基本用法,包括对内置类型和自定义类型的动态内存分配与释放。此外,文章还深入解析了`operator new`和`operator delete`的底层实现,以及定位new表达式的应用,最后总结了`malloc`/`free`与`new`/`delete`的主要差异。
212 3
|
机器学习/深度学习 人工智能 算法
数据挖掘/深度学习-高校实训解决方案
云原生一站式机器学习/深度学习/大模型AI平台,支持sso登录,多租户,大数据平台对接,notebook在线开发,拖拉拽任务流pipeline编排,多机多卡分布式训练,超参搜索,推理服务VGPU,边缘计算,serverless,标注平台,自动化标注,数据集管理,大模型微调,vllm大模型推理,llmops,私有知识库,AI模型应用商店,支持模型一键开发/推理/微调,支持国产cpu/gpu/npu芯片,支持RDMA,支持pytorch/tf/mxnet/deepspeed/paddle/colossalai/horovod/spark/ray/volcano分布式,私有化部署。
399 0
|
小程序 测试技术 程序员
『软件工程12』软件工程实践方法——软件测试
该文章详细阐述了软件测试的重要性和基本原则,并按测试阶段顺序介绍了单元测试、集成测试、确认测试以及系统测试的具体内容和实施步骤。
『软件工程12』软件工程实践方法——软件测试
WK
|
开发框架 移动开发 Java
C++和Java哪个更适合开发移动应用
本文对比了C++和Java在移动应用开发中的优劣,从市场需求、学习难度、开发效率、跨平台性和应用领域等方面进行了详细分析。Java在Android开发中占据优势,而C++则适合对性能要求较高的场景。选择应根据具体需求和个人偏好综合考虑。
WK
378 0