2017-06-20 97 views
0

我在快速使用TimeZone時遇到了一些麻煩。TimeZone問題swift3

func date(hour: Int, minute: Int, timeZone: TimeZone) -> Date { 
    let components = DateComponents(calendar: Calendar.current, timeZone: timeZone, era: nil, year: nil, month: nil, day: nil, hour: hour, minute: minute, second: 0, nanosecond: 0, weekday: nil, weekdayOrdinal: nil, quarter: nil, weekOfMonth: nil, weekOfYear: nil, yearForWeekOfYear: nil) 
    return components.date! 
} 

var startDate_TimeZone = TimeZone.init(identifier:"Asia/Seoul") 
var endDate_TimeZone = TimeZone.current 

let startDate = date(hour: 13, minute: 00, timeZone: startDate_TimeZone!) 
// Returns "Jan 1, 1, 7:02 AM" 

let endDate = date(hour: 13, minute: 00, timeZone: endDate_TimeZone) 
// Returns "Jan 1, 1, 1:00 PM" 

爲什麼它返回一個加入2分鐘的時候,我初始化時區的時間?如何避免這種情況?

它也發生在不同的時區。 &我在文檔中沒有找到任何關於此的信息。

預先感謝您!

+2

計算的目的是什麼?爲什麼要計算0001年的日期? –

回答

0

這是一個2分鐘的偏移量,因爲如您所見,您使用的是第1年的日期。在iOS上(與大多數計算平臺一樣),時區由IANA time zone database定義。有第1年的任何時間區,但亞洲/首爾條目包含這樣的:

# Zone NAME   GMTOFF RULES FORMAT [UNTIL] 
Zone Asia/Seoul  8:27:52 -  LMT  1908 Apr 1 

也就是說,之前的1908年4月1日,GMT偏移量是8點27分52秒,它匹配你在做什麼看到。 (我對歷史不熟悉,所以我不知道爲什麼這是抵消 - 我猜根據漢城在預先時區的經度)。

你得到當年的1年,而不是因爲你的日期不指定年份:

let startDate = date(hour: 13, minute: 00, timeZone: startDate_TimeZone!) 

如果你想要的是13:00 今天,今年以來,像做這樣的:

let now = Date() 
let now1pm = Calendar.current.date(bySettingHour: 13, minute: 0, second: 0, of: now) 

如果這不是你想要的,請進一步解釋或看看Calendar其他有用的方法。

0

正如Martin在評論中指出的那樣,您正在計算0001年左右的時區。沒有時區數據可以追溯到那麼遠,因爲甚至連時區都沒有。

沒有有效日期參考的時區沒有意義。即使在現代,由於夏令時等因素,一年中的不同部分可能會得到不同的結果。

在您的轉換中指定一個有效的日期,它應該正常工作。