RFC 3339日期格式化程序 - 为什么输出日期会移动一天?

时间:2017-02-15 23:15:14

标签: ios objective-c nsdate nsdateformatter rfc3339

我们在使用Objective-c开发的现有iOS应用程序中遇到了一个问题。

问题:输出日期后退一天,仅适用于PST时区。

我们在下面写了将日期转换为短格式的代码。

-(NSString *)getDisplayDateFormat:(NSString *)dateString
{
    NSLocale *enUSPOSIXLocale;
    NSDateFormatter *inputformatter = [[NSDateFormatter alloc] init];
    enUSPOSIXLocale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"];
    [inputformatter setLocale:enUSPOSIXLocale];
    inputformatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
    [inputformatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssSSSZZZZ"];
    NSDate *date= [inputformatter dateFromString:dateString];
    NSDateFormatter *OutPutformatter = [[NSDateFormatter alloc] init];
    [OutPutformatter setDateFormat:@"yyyy-MM-dd"];
    NSString *dispalyDateString = [OutPutformatter stringFromDate:date];
    return dispalyDateString;
}

输入dateString = 2017-01-16T00:00:00-06:00

UTC格式:date = 2017-01-16 06:00:00 +0000

OutPut dateString = 2017-01-15

请帮助我们解决问题。

2 个答案:

答案 0 :(得分:0)

如果要捕获日期时间字符串日期部分的字符串表示形式,无论使用的本地时区是否与您自己的不同,最简单的方法是忽略所有时间和时区信息,然后抓取日期部分。最简单的形式是:

- (NSString *)getDisplayDateFormat:(NSString *)dateString {
    return [dateString substringToIndex:10];
}

或者,如果你真的打算将它转换为设备的语言环境(如果用户没有使用公历),那么你会这样做:

- (NSString *)getDisplayDateFormat:(NSString *)dateString {
    NSDateFormatter *inputFormatter = [[NSDateFormatter alloc] init];
    NSLocale *enUSPOSIXLocale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"];
    [inputFormatter setLocale:enUSPOSIXLocale];
    [inputFormatter setDateFormat:@"yyyy-MM-dd"];
    NSDate *date = [inputFormatter dateFromString:[dateString substringToIndex:10]];
    NSDateFormatter *outputFormatter = [[NSDateFormatter alloc] init];
    [outputFormatter setDateFormat:@"yyyy-MM-dd"];
    return [outputFormatter stringFromDate:date];
}

然后,再次,如果您尝试转换为用户的日历,您可能不会使用yyyy-MM-dd格式,而是使用一些用户友好的dateStyle

答案 1 :(得分:-1)

有人真的知道现在几点了吗?试试这个:

- (void)viewDidLoad {
    [super viewDidLoad];
    NSString *d = @"2017-01-16T00:00:00-06:00";

    NSArray *abbrevs = @[@"UTC", @"EDT", @"PST", @"HST", @"JST"];

    NSArray *names = @[@"UTC", @"America/New York", @"America/Los Angeles", @"Pacific/Honolulu", @"Asia/Japan"];

    for (int n = 0; n < abbrevs.count; n++) {

        NSString *na = abbrevs[n];
        NSString *nm = names[n];
        NSString *r = [self getDisplayDateFormat:d inTimeZone:[NSTimeZone timeZoneWithAbbreviation:na]];

        NSLog(@"Time is %@ in %@ (%@)", r, nm, na );

    }
}

-(NSString *)getDisplayDateFormat:(NSString *)dateString inTimeZone:(NSTimeZone*)tz
{
    NSLocale *enUSPOSIXLocale;
    NSDateFormatter *inputformatter = [[NSDateFormatter alloc] init];
    enUSPOSIXLocale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"];
    [inputformatter setLocale:enUSPOSIXLocale];
    inputformatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
    [inputformatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssSSSZZZZ"];
    NSDate *date= [inputformatter dateFromString:dateString];
    NSDateFormatter *OutPutformatter = [[NSDateFormatter alloc] init];
    //[OutPutformatter setDateFormat:@"yyyy-MM-dd"];
    // show the time also, for clarity 
    [OutPutformatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    // This is important! You must set the TimeZone for the output string - otherwise you get the local / device timezone
    OutPutformatter.timeZone = tz;
    NSString *dispalyDateString = [OutPutformatter stringFromDate:date];
    return dispalyDateString;
}