0

我们在使用 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;
}

输入日期字符串 = 2017-01-16T00:00:00-06:00

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

输出日期字符串 = 2017-01-15

请帮助我们解决问题。

4

2 回答 2

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.

于 2017-02-19T07:27:10.723 回答
-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;
}
于 2017-02-15T23:51:50.380 回答