我的应用程序与时区无关:我希望以忽略用户时区更改的方式保存和显示日期和时间。一旦我在我的应用程序中记录了某些用户操作的本地日期/时间(通常通过在sqlite数据库中保存timeIntervalSince1970),我想显示相同的日期/时间字符串,无论用户的时区是什么是否已更改,无论用户在其设备中的各种时区设置如何。
例如,如果用户的操作发生在旧金山当地时间下午1:15,然后他几天后在纽约打开我的应用程序,我希望之前的操作仍然显示为1 :15 pm(不是下午4:15),即使他在他的设备(例如,芝加哥)中手动设置了一些其他时区。在纽约时间晚上9点的第二次行动应该永远显示为晚上9点,即使回到加利福尼亚州。
我可以通过将每个日期/时间保存为字符串(基于用户的本地时区)来实现我的目标,然后再也不会使用日期方法 - 但是我无法做到日期/时间算术(例如,排序)。
保存和检索日期/时间时,如何才能与时区无关?
(当时区覆盖功能开启时,Apple的日历应用似乎会采用这种方式,但前提是我手动设置了事件时间。)
答案 0 :(得分:1)
这是工作解决方案(@Hot Licks值得信赖,但他没有发布答案):
gmtDate
方法,该方法执行从本地TZ到GMT的转换。 gmtDate
使用@"yyyy-MM-dd HH:mm"
作为格式字符串,它也会从值中删除秒数。像这样:+(NSDate *)gmtDate { NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm"; // drops the seconds dateFormatter.timeZone = [NSTimeZone systemTimeZone]; // the local TZ NSString *localTimeStamp = [dateFormatter stringFromDate:[NSDate date]]; // localTimeStamp is the current clock time in the current TZ // adjust date so it'll be the same clock time in GMT dateFormatter.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"]; NSDate *gmtDate = [dateFormatter dateFromString:localTimeStamp]; return gmtDate; }
在didFinishLaunchingWithOptions:
添加[NSTimeZone setDefaultTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]]
所以所有日期格式化工具默认情况下都会在GMT中创建日期字符串(但不要在格式字符串中包含时区)。
当需要保存用户操作的日期/时间时,请通过[NSDate gmtDate]
获取日期并将该值保存在数据库中。
答案 1 :(得分:0)
记录时区以及时间戳。稍后格式化时间戳时使用该时区。您需要在数据库表中添加另一列。
答案 2 :(得分:0)
按照Rob的建议保存时区,或将时间保存为NSDate
和字符串。使用UI的字符串和NSDate
进行计算。
或者嘿,如果你需要的话,就做三件事。