将NSDate格式化为YYYYMMDDHHMMSS.XXX [gmt offset [:tz name]]

时间:2016-04-12 05:31:20

标签: ios timestamp nsdate nsdateformatter

我正在尝试创建一个如下所示的日期:

19961005132200.124[-5:EST]

以下是我的尝试:

+ (NSString *)getDate {
    NSDateFormatter* df = [[NSDateFormatter alloc] init];
    [df setDateFormat:@"YYYYMMDDHHMMSS.000[ZZ:zzz]"];

    NSTimeZone *gmt = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
    [df setTimeZone:gmt];
    return [df stringFromDate:[NSDate date]];
}

这是回归:

201604103050483.000[+0000:GMT]

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

首先为Unicode specification for date format specifiers添加书签。

然后查看您需要的每个部分:

  • 4位数年份:yyyy
  • 2位数月份:MM
  • 2位数日:dd
  • 24小时2位数小时:HH
  • 2位数分钟:mm
  • 2位数秒:ss
  • 3位小数秒:SSS

时区存在问题,因为除了前导零之外,没有说明符会在冒号前给出部分。您将获得的最接近的是:x:z

将所有内容放在一起:yyyyMMddHHmmss.SSS[x:z]

+ (NSString *)getDate {
    NSDateFormatter* df = [[NSDateFormatter alloc] init];
    [df setDateFormat:@"yyyyMMddHHmmss.SSS[x:z]"];

    return [df stringFromDate:[NSDate date]];
}

如果您希望输出位于用户的本地时区,请不要设置格式化程序的时区。

答案 1 :(得分:0)

格式字符串使用格式模式Unicode Technical Standard #35

所以

- (NSString *)getDate {
    NSDateFormatter* df = [[NSDateFormatter alloc] init];
    [df setDateFormat:@"yyyyMMddHHmmss.SSS[Z:z]"];

    NSTimeZone *gmt = [NSTimeZone timeZoneWithAbbreviation:@"EST"];
    [df setTimeZone:gmt];
    return [df stringFromDate:[NSDate date]];
}

输出

20160412021134.302[-0500:EST]

选项2:

- (NSString *)getDate {
    NSDateFormatter* df = [[NSDateFormatter alloc] init];
    [df setDateFormat:@"yyyyMMddHHmmss.SSS[Z:z]"];

    NSTimeZone *gmt = [NSTimeZone timeZoneWithAbbreviation:@"EST"];
    [df setTimeZone:gmt];

    NSString *date = [df stringFromDate:[NSDate date]];
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(\\d+\\.\\d+\\[[+-]?)(0?)(\\d)(\\d{2})(.*)" options:NSRegularExpressionCaseInsensitive error:nil];
    return [regex stringByReplacingMatchesInString:date options:0 range:NSMakeRange(0, date.length) withTemplate:@"$1$3$5"];
}

输出:

20160412021134.302[-5:EST]