2015-08-14 50 views
2

请帮我获取当地日期和一天的开始,我的意思是午夜。为了得到当地的日期我使用下面的代码,但我不认为这是正确的Swift获取本地日期实例

var calendar = NSCalendar(calendarIdentifier: NSGregorianCalendar) 
     calendar!.timeZone = NSTimeZone.localTimeZone() 
     let components = NSDateComponents() 
     components.second = NSTimeZone.localTimeZone().secondsFromGMT 
     let today = calendar!.dateByAddingComponents(components, toDate: NSDate(), options: nil) 

但我不能让这一天的午夜,它不断返回时间21.00

var comps = calendar!.components(NSCalendarUnit.YearCalendarUnit | .MonthCalendarUnit | .DayCalendarUnit | .HourCalendarUnit | .MinuteCalendarUnit | .SecondCalendarUnit, fromDate: today!) 
     comps.hour = 0 
     comps.minute = 0 
     comps.second = 0 

     let startToday = calendar!.dateFromComponents(comps)! 

即使此退货21.00

calendar!.startOfDayForDate(today) 
+3

这看起来像另一个“NSDate的描述总是使用GMT”的副本。请参阅http://stackoverflow.com/questions/8466744/getting-date-from-nsdate-date-off-by-a-few-hours。 –

+0

请注意,根据您当地的时区,“startToday”设置为午夜,格林威治可能是21:00。 –

+0

电脑位置或当地日期的任何地方的当地日期?而对于一天的开始,你想要什么时区的结果呢?世界标准时间? – MirekE

回答

0

NSDate没有附加时区。对于一些令人头疼的原因,苹果决定始终以格林威治标准时间显示日期,当你print它。在这个足够脱发后,我决定写我自己的描述方法请参见日期在我的本地时区:

extension NSDate { 
    public var localTimeString : String { 
     let formatter = NSDateFormatter() 
     formatter.dateFormat = "yyyy-MM-dd HH:mm:ss Z" 
     formatter.timeZone = NSTimeZone.localTimeZone() 

     return formatter.stringFromDate(self) 
    } 
} 

let now = NSDate() 
let flags : NSCalendarUnit = [.Day, .Month, .Year] 
let gregorian = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)! 
let components = gregorian.components(flags, fromDate: now) 
let today12AM = gregorian.dateFromComponents(components)! 

print(today12AM) 
print(today12AM.localTimeString) 

编辑:

您可以手动时间构建一个观点:

let x = gregorian.dateWithEra(1, year: 2015, month: 8, day: 15, hour: 0, minute: 0, second: 0, nanosecond: 0)! 
print(x) 
print(x.localTimeString) 

print(x.timeIntervalSince1970) // seconds since midnight Jan 1, 1970 
print(today12AM.timeIntervalSince1970) 

xtoday12AM没有什么不同。正如我所说,NSDate没有内置时区。当您使用print时,它会将您的日期转换为GMT。这就是为什么它在表达自己的时区时出现表面上不同于同一时间点的原因。

+0

它返回日期的字符串表示,但我需要日期实例,所以today12AM仍然是21:00 – nzackoya