【问题标题】:iOS - Proper formatting of timestamps between mySQL (apache) and iOS (NSDate)iOS - mySQL (apache) 和 iOS (NSDate) 之间时间戳的正确格式
【发布时间】:2013-04-10 13:11:23
【问题描述】:

我正在尝试将时间戳 (yyyy-MM-dd HH:mm:ss) 从 mySQL(在 apache 上运行)传递到 iOS。目前,mysql设置为这个时区:

default-time-zone='+00:00'

当我将此时间戳传递给 iOS 时,我使用此代码将字符串转换为 NSDate:

-(NSDate *)formatDateWithString:(NSString *)dateString{
     NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
     [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
     NSDate* date = [dateFormatter dateFromString:dateString];
     NSLog(@"Formatted Timestamp: %@ - Original Timestamp: %@", date,dateString);
     return date;
}

这是 2013-04-17 16:33:56 的 mySQL 时间戳的输出:

Formatted Timestamp: 2013-04-17 23:33:56 +0000 - Original Timestamp: 2013-04-17 16:33:56

为什么 iOS 会增加 7 小时? (仅供参考 - 我位于加利福尼亚州旧金山,所以我确信这与我的时区是 PDT 有关。只是不确定为什么当我没有指定它时它会以这种方式转换)。

在我的应用中尽可能使用最“通用”的时间戳很重要,因为我的用户可能遍布世界各地,并且不想对大量转换大惊小怪。我希望能够将时间戳存储在 mySQL 中,然后只需比较存储的服务器时间戳和当前服务器时间戳之间的差异。如果可能的话,每次我需要进行比较时,我宁愿不必使用网络请求来获取“服务器时间”。

更新

通过将这行代码添加到我的 dateFormatter 中,现在似乎两次正确匹配:

[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

但是,无论一年中的什么时候,任何人都可以验证它始终会继续匹配吗? (即夏令时等)

【问题讨论】:

    标签: mysql ios timezone timestamp nsdate


    【解决方案1】:

    默认情况下,NSDateFormatter 设置为 localTimeZone。由于您的 dateString 没有时区信息,因此它计算了 localTimeZone 的时间。如果您知道 dateString 的时区是 UTC,那么您需要将其设置为 dateFormatter。

    NSDate 表示绝对时间,表示可以随 timeZones 变化,但它是一个唯一值,不受夏令时影响。

    -(NSDate *)formatDateWithString:(NSString *)dateString{
         NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
         [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
         [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
         NSDate* date = [dateFormatter dateFromString:dateString];
         NSLog(@"Formatted Timestamp: %@ - Original Timestamp: %@", date,dateString);
         return date;
    }
    

    【讨论】:

    • 是的,这是我发布后不久得出的结论。你能验证这些时间总是正确匹配吗? (即不会因夏令时等原因而改变)
    • @JamesHickman 我不太确定夏令时。但这一直对我有用。如果您可以控制 dateFormat,则可以将 +0700 或 +0000 等时区信息包含在 dateFormat 中以获得更大的灵活性。这篇文章将是一个很好的指针stackoverflow.com/a/6866992/767730
    • 好的,据我所知,UTC 似乎不受任何夏令时或其他季节性变化的影响。幸运的是,我只需要在我的应用程序中显示任意 2 个日期之间的时间差异,因此我不需要显示每个时区的确切时间。
    • @JamesHickman - 在我开发的一个应用程序中,我们使用了-[NSDate dateWithTimeIntervalSince1970],并让 API 提供了自 1970 年 1 月 1 日格林威治标准时间以来的秒数。这消除了需要知道用户所在时区的任何问题,并且我们的各种客户端根据用户的当前时区或指定的默认值显示日期/时间信息。
    • @AaronBrager - 是的,这就是我现在使用实际日期/时间戳所做的事情。我更喜欢使用时间间隔,因为我认为它会更一致且更容易转换为时区,但是 mysql 没有内置的方法来将时间戳存储在“时间戳”字段中作为时间间隔(至少我知道)。
    猜你喜欢
    • 1970-01-01
    • 2012-01-25
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-18
    • 2014-04-17
    相关资源
    最近更新 更多