我们在使用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
请帮助我们解决问题。
答案 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;
}