时间转换
参考资料
需要注意的是:使用 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 | 毫秒。如,: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()
= "yyyy-MM-dd'T'HH:mm:"
= .formatted(dateformatter)
let r = try! (, from: (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':''ZZZZ'"
d.timeZone = TimeZone.init(secondsFromGMT: 0)
let date = d.date(from: createdAt)