web-dev-qa-db-ja.com

Swift 3タイムゾーンの問題

setDefaultTimeZoneメソッドはNSTimeZoneで使用できなくなったようです。誰かがこれの代わりを知っていますか?

私のAppDelegate.Swift、 私が持っています:

NSTimeZone.default = TimeZone(abbreviation: "BST")!

他のすべてのファイルでは、NSTimeZoneがこの値に設定されるため、意図したとおりに動作します

今、私のユーティリティでは、このメソッドがあります:

static func getDate(_ dateStr: String) -> Date {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd"
    // dateFormatter.timeZone = TimeZone(abbreviation: "GMT")
    let date =  dateFormatter.date(from: dateStr)!
    return date
}

それでは、入力2016-10-07、それは私に戻ってきます2016-10-06 23:00。どうして?上記のコードの行のコメントを解除すると修正されます。どこでもこの行を使いたくありません。

たとえば、プロジェクトの他の部分では、 CVCalendar を使用しています。変換された日付を取得するための関数を提供します

func didSelectDayView(_ dayView: DayView, animationDidFinish: Bool) {
    selectedDay = dayView
    selectedDate = dayView.date.convertedDate()!
}

ここでも以前と同じことが起こっています...つまり、2016-10-08そしてそれはselectedDateここで2016-10-07 23:00

そしてその NSTimeZone.Default印刷Europe/London どこにでも。

なぜこれが起こっているのか誰にも分かりますか?

13
AmrataB
let locale = NSTimeZone.init(abbreviation: "BST")
NSTimeZone.default = locale as! TimeZone

これを試して

8
Jitendra Modi

このようにしてみてください。

TimeZone.ReferenceType.default = TimeZone(abbreviation: "BST")!

編集:TimeZoneDateFormatterを使用し、日付で正しいBST時刻を取得しました。

TimeZone.ReferenceType.default = TimeZone(abbreviation: "BST")!
let formatter = DateFormatter()
formatter.timeZone = TimeZone.ReferenceType.default
formatter.dateFormat = "yyyy-MM-dd HH:mm"
let strDate = formatter.string(from: Date())
print(strDate)

defaultTimeZoneオブジェクトにNSTimeZoneを設定する場合は、Swift 3)で次のように設定できます。

NSTimeZone.default = TimeZone(abbreviation: "BST")!
13
Nirav D

カレンダーを使用している場合、

// *カレンダーオブジェクトの作成*

var calendar = NSCalendar.current

// *使用するカレンダーコンポーネントを定義し、UTCのタイムゾーン*

let unitFlags = Set<Calendar.Component>([.hour, .year, .minute])
calendar.timeZone = TimeZone(identifier: "UTC")!
/// Returns a time zone initialized with a given identifier.
///
/// An example identifier is "America/Los_Angeles".
///
/// If `identifier` is an unknown identifier, then returns `nil`.
public init?(identifier: String)

タイムゾーンを識別する地政学的地域識別子。

public var identifier:String {get}

:日付フォーマッターのタイムゾーンを設定する場合は、上記のアプローチを次のように実行できます。

dateFormatter.timeZone = TimeZone(identifier: "UTC")!
2
Wolverine