保存NSDate后忽略时区更改

时间:2015-01-27 22:20:31

标签: ios nsdate nstimezone

我的应用程序与时区无关:我希望以忽略用户时区更改的方式保存和显示日期和时间。一旦我在我的应用程序中记录了某些用户操作的本地日期/时间(通常通过在sqlite数据库中保存timeIntervalSince1970),我想显示相同的日期/时间字符串,无论用户的时区是什么是否已更改,无论用户在其设备中的各种时区设置如何。

例如,如果用户的操作发生在旧金山当地时间下午1:15,然后他几天后在纽约打开我的应用程序,我希望之前的操作仍然显示为1 :15 pm(不是下午4:15),即使他在他的设备(例如,芝加哥)中手动设置了一些其他时区。在纽约时间晚上9点的第二次行动应该永远显示为晚上9点,即使回到加利福尼亚州。

我可以通过将每个日期/时间保存为字符串(基于用户的本地时区)来实现我的目标,然后再也不会使用日期方法 - 但是我无法做到日期/时间算术(例如,排序)。

保存和检索日期/时间时,如何才能与时区无关?

(当时区覆盖功能开启时,Apple的日历应用似乎会采用这种方式,但前提是我手动设置了事件时间。)

3 个答案:

答案 0 :(得分:1)

这是工作解决方案(@Hot Licks值得信赖,但他没有发布答案):

  1. 子类NSDate并添加gmtDate方法,该方法执行从本地TZ到GMT的转换。 gmtDate使用@"yyyy-MM-dd HH:mm"作为格式字符串,它也会从值中删除秒数。像这样:
  2. +(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;
    }
    
    1. didFinishLaunchingWithOptions:添加[NSTimeZone setDefaultTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]]所以所有日期格式化工具默认情况下都会在GMT中创建日期字符串(但不要在格式字符串中包含时区)。

    2. 当需要保存用户操作的日期/时间时,请通过[NSDate gmtDate]获取日期并将该值保存在数据库中。

答案 1 :(得分:0)

记录时区以及时间戳。稍后格式化时间戳时使用该时区。您需要在数据库表中添加另一列。

答案 2 :(得分:0)

按照Rob的建议保存时区,或将时间保存为NSDate 字符串。使用UI的字符串和NSDate进行计算。

或者嘿,如果你需要的话,就做三件事。