IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> iOS-Swift中Date -VS- Objective-C NSDate -> 正文阅读

[移动开发]iOS-Swift中Date -VS- Objective-C NSDate

最近Swift项目开发中,涉及到了日期时间的处理,需求是这样的,需要把一个日期格式类型的字符串,转换为Date类型,但是转换完发现和OC中处理的结果不太一样,具体如下所示:

先来看下OC版本的代码:

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    NSString *currentTime = [self dateTransformToTimeString];
    NSLog(@"currentTime = %@", currentTime);
    NSDate *currentDate = [self timeStrToDate:currentTime];
    NSLog(@"date = %@",currentDate);
}

#pragma mark 将NSDate --> NSString
- (NSString *)dateTransformToTimeString {
    NSDate *currentDate = [NSDate date];//获得当前时间为UTC时间 2014-07-16 07:54:36 UTC  (UTC时间比标准时间差8小时)
    NSDateFormatter*dateFormatter = [[NSDateFormatter alloc]init];//实例化时间格式类
    [dateFormatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"];//格式化
    [dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"Asia/BeiJing"]];
    NSString *timeString = [dateFormatter stringFromDate:currentDate];
    return timeString;
}

#pragma mark 将时间NSString --> NSDate
- (NSDate *)timeStrToDate:(NSString *)timeStr {
    
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateStyle:NSDateFormatterMediumStyle];
    [formatter setTimeStyle:NSDateFormatterShortStyle];
    [formatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"];
    NSTimeZone* timeZone = [NSTimeZone timeZoneWithName:@"Asia/Beijing"];
    [formatter setTimeZone:timeZone];
    NSDate *date = [formatter dateFromString:timeStr];
    return date;
}
@end

输出结果如下所示:

2021-11-26 17:31:03.535092+0800 OCDemo[36383:1191861] currentTime = 2021-11-26 17:31:03
2021-11-26 17:31:15.342025+0800 OCDemo[36383:1191861] date = Fri Nov 26 17:31:03 2021
image.png

注意看,这里OC中把NSString -> NSDate完全没有问题,但是相同的代码,请看Swift如下的输出结果:

override func viewDidLoad() {
        super.viewDidLoad()

        let currentTime = dateTransformToTimeString()
        print("currentTime = \(String(describing: currentTime))")
        let currentDate = timeStringTransformToDate(toDate: currentTime)
        print("date = \(currentDate)")

     
    }
    // MARK: 获取当前时间
    func dateTransformToTimeString() -> String? {
        let currentDate = Date() //获得当前时间为UTC时间 2014-07-16 07:54:36 UTC  (UTC时间比标准时间差8小时)
        let dateFormatter = DateFormatter() //实例化时间格式类
        dateFormatter.dateFormat = "YYYY-MM-dd HH:mm:ss" //格式化
        dateFormatter.timeZone = NSTimeZone(name: "Asia/BeiJing") as TimeZone?
        let timeString = dateFormatter.string(from: currentDate)
        return timeString
    }

    //将时间字符串转换为时间Date
    func timeStringTransformToDate(toDate timeStr: String?) -> Date {
        let formatter = DateFormatter()
        formatter.dateStyle = .medium
        formatter.timeStyle = .short
        formatter.dateFormat = "YYYY-MM-dd HH:mm:ss"
        formatter.timeZone = NSTimeZone(name: "Asia/BeiJing") as TimeZone?
        let date = formatter.date(from: timeStr ?? "") ?? Date()
        return date
    }

Swift中输出结果如下:

currentTime = Optional("2021-11-26 17:38:42")
date = 2021-11-26 09:38:42 +0000
image.png

注意看,这里Swift中把String -> Date时区就差了8小时,这里查阅资料说的是Swift中Date是0时区造成的,具体可以参考Swift4中对于日期时间的处理(Date、DateComponents、Calendar、DateFormatter、Locale 文章,里面解释的比较详细。

那么如何让Swift中打印和OC中的时间一样准确,也是当前北京时间呢,只需要将 formatter.timeZone = NSTimeZone(name: "Asia/BeiJing") as TimeZone?写法替换为formatter.timeZone = TimeZone.init(secondsFromGMT: 8)即可解决问题,效果如下所示:

image.png

具体原因没有深究,可能这也是OC和Swift中的一点点不同之处吧。这里也记录下Swift学习之路的小坑~

END.

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-11-28 11:24:56  更:2021-11-28 11:26:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:55:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码