iOS:NSDate和NSString转换注意事项(菜鸟教程)

99 阅读1分钟

1、String -> Date

​
NSString *dateStr = @"2022-09-13 00:00:00";

NSDateFormatter*dateFormatter = [[NSDateFormatter alloc]init];
dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
dateFormatter.timeZone = [NSTimeZone timeZoneWithName:@"Asia/Shanghai"];// 代表 2022-09-13 00:00:00 是 Asia/Shanghai 时区的时间

/*
 * 如果将手机设置为 Asia/Shanghai 时区,则 date 为 2022-09-13 00:00:00 // 因为和 dateFormatter.timeZone 相同
 * 如果本机是 America/New_York 时区(西四区),date 为 2022-09-12 12:00:00(减去 12 个小时)
 */ 
NSDate *date = [dateFormatter dateFromString:dateStr];
​

2、Date -> String

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
dateFormatter.timeZone = [NSTimeZone timeZoneWithName:@"Asia/Shanghai"];

NSDate *nowDate = [[NSDate alloc] init];// 该方法获取的时间为本机时间,如果在手机的设置上手动调节时间,则下述方法获取的值也会跟着变

/*
 * 如果本机是 Asia/Shanghai 时区,则 dateStr 数值和 nowDate 一致
 * 如果本机是 America/New_York 时区(西四区),则 dateStr 比 nowDate 大12小时
 * 例如:
 * nowDate(西四区):Tue Sep 13 03:07:41 2022 
 * 则dateStr(为东八区,因为dateFormatter的timeZone为Asia/Shangha):“2022-09-13 15:07:41”
 * dateStr为dateFormatter对应的timeZone的时间
 */
NSString *dateStr = [dateFormatter stringFromDate:nowDate];

注意:

  1. NSDate *nowDate = [[NSDate alloc] init]; 获取到的是本机时间只和本机设置中的时区有关!
  2. NSDate *date = [dateFormatter dateFromString:dateStr];获取到的是dateFormatter.timeZone时区 -> 本机时区后的时间
  3. NSString *dateStr = [dateFormatter stringFromDate:nowDate];获取到的是本机时区-> dateFormatter.timeZone时区 后的时间