2015-08-14 49 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