iOS 时间格式化

时间转换

参考资料


需要注意的是:使用 NSFormatter 是一个比较耗费资源的操作,如果需要多次使用 NSFormatter,建议复用 NSFormatter 实例来减小资源消耗,防止卡顿


字符串转时间

iOS 中 NSDate 是时间管理类,这里获取到的时间是 UTC 时间,可以根据需要转换成任意地区的时间。
NSFormatter 类是时间格式化类,可以根据指定的格式、地区将指定的时间转换为 NSDate 对象

NSString* string = @"20110826134106";
    NSDateFormatter *inputFormatter = [[[NSDateFormatter alloc] init] autorelease];
    [inputFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease]];
    [inputFormatter setDateFormat:@"yyyyMMddHHmmss"];
    NSDate* inputDate = [inputFormatter dateFromString:string];

时间格式转换

NSString *dateStr = @"2015-11-25 00:00";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
//  [formatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm"];
NSDate *date = [formatter dateFromString:dateStr];

formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy年MM月dd日"];
NSString *result = [formatter stringFromDate:date];

获取本地时间

NSDate *date = [NSDate date];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setTimeZone:[NSTimeZone localTimeZone]];
// [formatter setLocale:[NSLocale currentLocale]];
NSString *result = [formatter stringFromDate:date];

获取年月日

NSDate*date = [NSDate date];
NSCalendar*calendar = [NSCalendar currentCalendar];
NSDateComponents*comps;

// 年月日获得
comps =[calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit |NSDayCalendarUnit) fromDate:date];

NSIntegeryear = [comps year];
NSIntegermonth = [comps month];
NSIntegerday = [comps day];

时间转换为指定时间点

考虑到闰秒等特殊情况,在计算 A 时间提前或延后 B 天这种情况时,不建议按照一天 24 小时的方式直接计算,这样会有较大误差。
特别是计算 A 时间 n 天后是几月几号这种问题,最好的方式就是使用 Calendar 来计算。

let date = Date.init()
self.nextTime = self.calendar.date(byAdding: .day, value: 7, to: date)!.timeIntervalSince1970

时间格式

符号 含义
yy 年的后2位
yyyy 完整年
MM 月,显示为1-12
MMM 月,显示为英文月份简写,如 Jan
MMMM 月,显示为英文月份全称,如 Janualy
dd 日,2位数表示,如02
d 日,1-2位显示,如 2
EEE 简写星期几,如Sun
EEEE 全写星期几,如Sunday
aa 上下午,AM/PM
H 时,24小时制,0-23
K 时,12小时制,0-11
m 分,1-2位
mm 分,2位
s 秒,1-2位
ss 秒,2位
S 毫秒。如,s.SS:3.12秒

解析 ISO 8601

对于 ISO 8601 的时间格式 Swift 中 JSONDecoder 提供了和好的支持,只要制定其属性 dateDecodingStrategy.iso8601 即可。

这样就可以实现解析 JSON 时直接将其中的时间字符串转换为 Date 类。

不过这个解析目前存在一个问题就是,如果时间字符串中的秒带有毫秒,解析就会失败。例如:“2018-07-19T08:33:18.914Z”,就不能正确解析。对于这个问题可以使用如下方式:

let jsonData = "{\"date\":\"2018-07-24T09:03:20.322Z\"}"
let decoder = JSONDecoder()
let dateformatter = DateFormatter()
dateformatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ"
decoder.dateDecodingStrategy = .formatted(dateformatter)
let r = try! decoder.decode(Test.self, from: jsonData.data(using: .utf8)!)

如果使用 DateFormatter 可以这样写:

let createdAt = "2018-07-24T09:03:20.322Z"
let d = DateFormatter.init()
d.locale = Locale.init(identifier: "en_US_POSIX")
d.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.SSSS'ZZZZ'"
d.timeZone = TimeZone.init(secondsFromGMT: 0)

let date = d.date(from: createdAt)

你可能感兴趣的:(iOS)