Art*_*sev 0 objective-c nsdate nsdateformatter nstimezone ios
我有以下代码:
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);
Run Code Online (Sandbox Code Playgroud)
NSLog(@"%@", timeStampForCity); 输出:
2011-08-01 10:05:50 PM EDT
Run Code Online (Sandbox Code Playgroud)
但是NSLog(@"%@", updateDate);产出:
2011-08-02 02:05:50 +0000
Run Code Online (Sandbox Code Playgroud)
我需要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];
Run Code Online (Sandbox Code Playgroud)
但它显示的时区对许多地区来说都是关闭的.
提前谢谢你的帮助.
再来一次...
日期是一个独立的时间点.无论人类和我们的时间测量设备是否存在,它都存在并将永远存在.时区是人类的一项发明,可以帮助我们不要发疯.陪审团仍然不清楚他们是否有效.:P
当你谈到想要"在EDT或任何其他时区的约会"时,你却未能掌握日期是什么.时区只是如何显示时间点的一个方面.
所以,你有一个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]);
}
Run Code Online (Sandbox Code Playgroud)
现在,显然这个输出将非常长(我的长度超过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
...
Run Code Online (Sandbox Code Playgroud)
那么,我们在这里看到了什么?在同一天有一大堆不同的字符串表示!整齐!换句话说,格式化程序的时区用于确定输出字符串的外观.
所以:日期本身具有NOTHING做的时区.如果您希望以某种方式查看日期,则必须配置格式化程序以使其看起来如此.
更新从您的评论,我想我得到你想要的.您想要为特定时区格式化日期组件吗?换句话说,你有一个时间点,你想知道(比如说)美国东部时区的小时/分钟/秒?
如果是这种情况,那么您可以根据日历执行此操作:
NSDate *date = [NSDate date];
NSCalendar *cal = [NSCalendar currentCalendar];
[cal setTimeZone:[NSTimeZone timeZoneWithName:@"EST"]];
NSDateComponents *components = [cal components:NSUIntegerMax fromDate:date];
NSLog(@"%@", components);
Run Code Online (Sandbox Code Playgroud)
这会给你:
<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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1400 次 |
| 最近记录: |