2016-06-07 76 views
2

在Objective-C中工作,我有一个方法来正确格式化从数据库中获得的日期。 数据库返回没有时区信息的日期和时间。例如'2016-06-07T09:29:50.253'。问题NSDateFormatter意外调整时间

问题是,它正确地获取日期,然后将其返回一个小时。在我09:29的时候,我最终会在08:29结束。

我现在正在与BST合作。

我有以下代码:

+(NSDate *)getDate:(NSString *)date { 

//Gets the date 
     date = [date stringByReplacingOccurrencesOfString:@"T" withString:@" "]; 
     date = [date componentsSeparatedByString: @"."][0]; 

//Formats the date 
     NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
//This line is the one that fixes it. 
     [formatter setTimeZone: [NSTimeZone timeZoneWithName:@"UTC"]]; 
     [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 

     NSDate *returnDate = [formatter dateFromString:date]; 
     return returnDate; 
    } 

我做了一些谷歌搜索,发现已增加以下行解决了这个问题。

[formatter setTimeZone: [NSTimeZone timeZoneWithName:@"UTC"]]; 

这是罚款,暂时的,但我担心它会在夏令时再次突破,我完全不知道为什么这个修复它。我也希望能够让它适应不同的时区,但至今还没有运气。

更多信息:

-The日来自SQL Server中的GETDATE()调用。我对此的理解是,它是按照现在的日期,不理解时区。如果我做了选择调用,我得到的结果是:“2016-06-07T09:29:50.253”

为了形式化的问题: 为什么会在上面的代码进行调整的returnDate?

+0

UTC是一个标准,而不是一个时区。为此使用GMT。更多信息 - http://www.timeanddate.com/time/aboututc.html – Andriy

+0

请在08:29添加“结束”。你怎么看日期?日期如何存储在数据库中 - 在某个时间点,时区将被声明或已经被约定。 – jrturton

+2

为什么要删除'T'和'.'后面的内容。将它们添加到日期格式。 – Larme

回答

0

有一个NSDate对象之间的一个重要区别,它是一个使用格式化表示:

NSDate对象永远是相对于通用的标准时间(UTC)。它无视夏时制和时区,这就是您希望将其存储在数据库中的方式(作为UTC时间戳)。

当您使用格式化程序时,它通常用于向用户显示日期。因此,格式化程序将默认使用当前设备的区域设置来表示日期,所以如果您的日期为11:00,并且您在+4时区没有夏令时,则您将获得的日期将是15:00。如果有夏令时,时间会稍微改变。你需要这种行为,因为这意味着无论你在世界的哪个地方,用户总会得到正确的相对时间。

除非像您一样,默认格式化程序使用“UTC”区域设置,不应将其与“+0”时区混淆。这就是为什么你会得到不同的日期。

0

尝试使用这个格式化器(而不是除去T和。):

let dateLiteral = "2016-06-07T09:29:50.253" 

let formatter = NSDateFormatter() 
formatter.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.SSS'Z'" 
formatter.dateFromString(dateLiteral) // Jun 7, 2016, 9:29 AM 
+0

您应该从格式化程序中移除'Z',因为日期字符串中没有'Z'。此外,仅供参考,'''仅在'T'周围需要。 – Rob

+0

感谢@Rob给你评论。 –