- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下代码:
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/
为什么 init 不能在 NSCalendar *cal = [[NSCalendar alloc] init] 中使用,因为 init 是每个类的实例方法有吗? 最佳答案 NSCalendar 必须
我正在尝试创建 NSCalendar 的子类,但运气不佳。我尝试了两种方法: 彻底的类别。我可以创建一个修改后的对象,并且我添加的测试方法(不是 NSCalendar 的一部分)工作得很好,但重写的方
我正在尝试创建一个日/月 UIPickerView,没有年份。目标是选择一天/月份来列出当天/月份发生的历史事件。 [NSCalendar currentCalendar]maximumRangeOf
在 Mac OS X 上,如果您转到系统首选项 > 日期和时间 > 打开语言和文本 > 在顶部单击格式 >,然后在日历下拉列表中出现一个科普特日历选项。如何在 Mac 应用程序中显示此日历? 最佳答案
有谁知道是否有办法在 NSCalendar 上设置一周的第一天,或者是否有一个日历已经将星期一而不是星期日作为一周的第一天。我目前正在开发一个基于一周工作量的应用程序,它需要从周一开始,而不是周日。我
是否可以根据位置获取firstWeekday。例如,在美国应该说星期天。在俄罗斯应该说星期一。 编辑:[[NSCalendar currentCalendar] firstWeekday]总是说1,但
我正在开发一个项目,我想在我的应用程序中集成 NSCalendar 功能。因此我用谷歌搜索,发现this 解决方案。它给了我一年中的所有月份,我也可以选择特定的日期。没关系。但我想禁用每个月的所有星期
这个问题在这里已经有了答案: Getting date from [NSDate date] off by a few hours (3 个答案) NSLog showing the previo
我使用下面的代码使用随机日期计算前一个星期一。哪个工作文件,但我的代码在明年日期中断。下面是相同的代码: NSDate *date = [NSDate dateWithTimeIntervalSinc
假设以下内容适用于所有设备是否安全? let cal = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)! 我不是应用程序本
我正在尝试从日期中获取周数。有人能告诉我为什么无论我输入什么日期都只返回 0 吗: let currentWeekNumber = NSCalendar.currentCalendar().compo
我有一个函数,它根据月份和年份返回周数数组。 代码如下: let calendar = NSCalendar.currentCalendar() let weekRange = calendar.ra
我正在创建各种日历控件... 我需要知道的一件事是一个月有多少周...... 所以 NSCalendar rangeOfUnit:inUnit:forDate 似乎正是我需要的... 除了我注意到一些
我正在尝试在两个不同的日期上使用 [[NSCalendar currentCalendar] ordinalityOfUnit:NSDayCalendarUnit inUnit:NSEraCalend
我正在 viewDidLoad 中初始化 NSCalendar,如下所示: gregorian = [NSCalendar currentCalendar]; 日历在相应的 .h 文件中声明,如下所示
我希望能够在 iPhone 上使用 NSCalendar 在公历和儒略历(注意:不是“儒略日期”)之间进行转换。如何子类化 NSCalendar 以使用儒略历?我想这样做,而不考虑 1582 年或 1
我有一个方法的子集,需要获取当月的第一天。 NSDate *today = [NSDate date]; // returns correctly 28 february 2013 NSCalend
我很难理解 dateByAddingComponents 如何处理夏令时的异常。我已阅读 Apple 日期和时间编程指南,并期望 dateByAddingComponents 考虑 DST 更改。但是
在 Swift3 之前,在我的项目中我使用了这个函数: var components = (calendar as NSCalendar).components([.year, .monthSymbo
我刚刚查看了 NSCalendar.h 中的代码,如下所示: enum { NSEraCalendarUnit = kCFCalendarUnitEra, NSYearCalendar
我是一名优秀的程序员,十分优秀!