gpt4 book ai didi

objective-c - 关于 NSDateFormatter 和 NSCalendar 的问题(涉及时区)

转载 作者:行者123 更新时间:2023-11-28 18:14:25 36 4
gpt4 key购买 nike

我有以下代码:

    self.formatter = [[NSDateFormatter alloc] init];
[formatter setTimeZone:timeZone];
[formatter setDateFormat:@"YYYY-MM-dd hh:mm:ss a z"];
timeStampForCity = [formatter stringFromDate:[NSDate date]];
NSLog(@"%@", timeStampForCity);
updateDate = [formatter dateFromString:timeStampForCity];
NSLog(@"%@", updateDate);

NSLog(@"%@", timeStampForCity); 输出:

2011-08-01 10:05:50 PM EDT

但是 NSLog(@"%@", updateDate); 输出:

2011-08-02 02:05:50 +0000

我需要 updateDate 来显示当前时区的时间(例如,如第一个 NSLog() 输出所示)。我该如何正确执行此操作?

编辑 1

我也有这个代码:

    NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit| NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSTimeZoneCalendarUnit;
NSDateComponents *dateComponents = [gregorian components:unitFlags fromDate:[NSDate date]];
[dateComponents setTimeZone:[NSTimeZone timeZoneWithName:cityNameFormatted]];
updateDate = [gregorian dateFromComponents:dateComponents];
[gregorian release];

但它显示的时区在许多地区都是关闭的。

提前感谢您的帮助。

最佳答案

我们又来了...

日期是一个独立的时间点。它存在并将永远存在,无论人类和我们的时间测量设备是否存在。时区是人类的发明,可以帮助我们避免发疯。陪审团仍然不知道他们是否有效。 :P

当您谈论想要“美国东部时间或任何其他时区的日期”时,您并没有掌握什么是日期。时区只是如何显示时间点的一个方面。

所以,您有一个 NSDate。这个日期是正确的日期,不管你在哪个时区。那么你如何“显示当前时区的时间”?您使用 NSDateFormatter

NSDate 本质上是不可读的。我们可以通过多种方式表示一个日期,例如来自不同时间点的秒间隔(它本身是任意长的间隔)。但是,要使日期人类可读 只能通过将其格式化为字符串来实现。那么,让我们这样做:

NSDate *myDate = [NSDate date]; // or whatever date you want to make human-readable
NSDateFormatter *f = [[NSDateFormatter alloc] init];
[f setDateStyle:NSDateFormatterLongStyle];
[f setTimeStyle:NSDateFormatterLongStyle];

NSArray *timeZoneNames = [NSTimeZone knownTimeZoneNames];
for (NSString *name in timeZoneNames) {
NSTimeZone *tz = [NSTimeZone timeZoneWithName:name];
[f setTimeZone:tz];
NSLog(@"%@", [f stringFromDate:date]);
}

现在,显然这个输出会非常长(我的超过 400 行)。但这是该输出的示例:

...
August 2, 2011 1:03:38 AM GMT-03:00
August 2, 2011 12:03:38 AM AST
August 2, 2011 12:03:38 AM GMT-04:00
August 1, 2011 11:03:38 PM EST
August 2, 2011 1:03:38 AM GMT-03:00
August 1, 2011 11:03:38 PM CDT
August 2, 2011 12:03:38 AM AST
August 2, 2011 1:03:38 AM GMT-03:00
August 1, 2011 10:03:38 PM CST
August 2, 2011 12:03:38 AM AST
August 2, 2011 12:03:38 AM GMT-04:00
August 1, 2011 11:03:38 PM GMT-05:00
August 1, 2011 10:03:38 PM MDT
August 1, 2011 10:03:38 PM MDT
August 2, 2011 12:03:38 AM GMT-04:00
August 1, 2011 11:03:38 PM CDT
August 1, 2011 11:33:38 PM GMT-04:30
August 2, 2011 1:03:38 AM GMT-03:00
August 1, 2011 11:03:38 PM EST
August 1, 2011 11:03:38 PM CDT
August 1, 2011 10:03:38 PM MDT
...

那么,我们在这里看到了什么? 相同的日期 有一大堆不同的 字符串表示!整洁的!换句话说,格式化程序 的时区用于确定输出字符串的外观。

因此:日期本身与时区无关。如果您希望日期以某种方式看起来,您必须配置格式化程序以使其看起来那样。


更新 从您的评论中,我想我得到了您想要的。您想要针对特定​​时区格式化的日期组件?换句话说,您有一个时间点,并且想知道(比如说)美国东部时区的小时/分钟/秒?

如果是这种情况,那么您可以根据日历 执行此操作:

NSDate *date = [NSDate date];
NSCalendar *cal = [NSCalendar currentCalendar];
[cal setTimeZone:[NSTimeZone timeZoneWithName:@"EST"]];

NSDateComponents *components = [cal components:NSUIntegerMax fromDate:date];
NSLog(@"%@", components);

这会给你:

<NSDateComponents: 0x100124240> 
Calendar: <CFCalendar 0x100133e90 [0x7fff7605cea0]>{identifier = 'gregorian'} / Time Zone: EST (GMT-05:00) offset -18000
Era: 1
Year: 2011
Month: 8
Day: 2
Hour: 9
Minute: 47
Second: 21
Week of Month: 1
Week of Year: 31
Year for Week of Year: 2011
Weekday: 3
Weekday Ordinal: 1
Quarter: 0

关于objective-c - 关于 NSDateFormatter 和 NSCalendar 的问题(涉及时区),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6906584/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com