web-dev-qa-db-ja.com

Swift Dateオブジェクトはどのように作成しますか

Swift xcodeの日付から日付オブジェクトをどのように作成しますか。

例えばJavaScriptではあなたがするだろう:var day = new Date('2014-05-20');

120
code_cookies

Swiftには独自のDatename__型があります。 NSDatename __を使用する必要はありません。

Swiftで日付と時刻を作成する

Swiftでは、日付と時刻は、2001年1月1日の参照日00:00:00 UTC からの経過秒数を測定する64ビット浮動小数点数で保管されます。これは Datename__構造体 で表現されます。次のようにすると現在の日時がわかります。

let currentDateTime = Date()

他の日時を作成するには、以下のいずれかの方法を使用できます。

方法1

2001年の基準日の前後の秒数がわかっている場合は、それを使用できます。

let someDateTime = Date(timeIntervalSinceReferenceDate: -123456789.0) // Feb 2, 1997, 10:26 AM

方法2

もちろん、Datename__を作成するには、(相対的な秒数ではなく)年、月、日、時間などのものを使用するほうが簡単です。これには、DateComponentsname__を使用してコンポーネントを指定し、次にCalendarname__を使用して日付を作成します。 Calendarname__はDatename__コンテキストを与えます。そうでなければ、どのタイムゾーンやカレンダーでそれを表現するのか、どうやって知るのでしょうか。

// Specify date components
var dateComponents = DateComponents()
dateComponents.year = 1980
dateComponents.month = 7
dateComponents.day = 11
dateComponents.timeZone = TimeZone(abbreviation: "JST") // Japan Standard Time
dateComponents.hour = 8
dateComponents.minute = 34

// Create date from components
let userCalendar = Calendar.current // user calendar
let someDateTime = userCalendar.date(from: dateComponents)

他のタイムゾーンの省略形は こちら で見つけることができます。空白のままにした場合、デフォルトではユーザーのタイムゾーンが使用されます。

方法3

最も簡潔な方法(必ずしも最善ではない)は、DateFormattername__を使用することです。

let formatter = DateFormatter()
formatter.dateFormat = "yyyy/MM/dd HH:mm"
let someDateTime = formatter.date(from: "2016/10/08 22:31")

DateFormattername__がサポートしている nicode技術標準は他のフォーマットを示しています

ノート

日付と時刻を読みやすい形式で表示する方法については、 私の完全な回答 を参照してください。これらの優れた記事も読んでください。

189
Suragch

これは既存のNSDateクラスへの拡張を使用して最もよく行われます。

次の拡張では、指定した形式の日付文字列を使用して現在のロケールで日付を作成する新しいイニシャライザが追加されています。

extension NSDate
{
    convenience
      init(dateString:String) {
      let dateStringFormatter = NSDateFormatter()
      dateStringFormatter.dateFormat = "yyyy-MM-dd"
      dateStringFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
      let d = dateStringFormatter.dateFromString(dateString)!
      self.init(timeInterval:0, sinceDate:d)
    }
 }

これで、SwiftからNSDateを作成できます。

NSDate(dateString:"2014-06-06")

この実装はNSDateFormatterをキャッシュしないことに注意してください。この方法で多くのNSDateを作成することが予想される場合は、パフォーマンス上の理由から行う必要があるかもしれません。

また、正しく解析できない文字列を渡してNSDateを初期化しようとすると、この実装は単にクラッシュします。これはdateFromStringによって返されるオプション値のラップを強制的に解除するためです。もしあなたが間違った解析でnilを返したいのならば、理想的には失敗可能な初期化子を使うでしょう。しかし、Swift 1.2の制限のため、今はできません(2015年6月)ので、次はクラスファクトリメソッドを使用することをお勧めします。

両方の問題に対処するより複雑な例はここにあります: https://Gist.github.com/algal/09b08515460b7bd229fa

108
algal

Swiftには独自のDate型はありませんが、既存のCocoaのNSDate型を使用してください。

class Date {

    class func from(year: Int, month: Int, day: Int) -> Date {
        let gregorianCalendar = NSCalendar(calendarIdentifier: .gregorian)!

        var dateComponents = DateComponents()
        dateComponents.year = year
        dateComponents.month = month
        dateComponents.day = day

        let date = gregorianCalendar.date(from: dateComponents)!
        return date
    }

    class func parse(_ string: String, format: String = "yyyy-MM-dd") -> Date {
        let dateFormatter = DateFormatter()
        dateFormatter.timeZone = NSTimeZone.default
        dateFormatter.dateFormat = format

        let date = dateFormatter.date(from: string)!
        return date
    }
}

どちらを使うことができます:

var date = Date.parse("2014-05-20")
var date = Date.from(year: 2014, month: 05, day: 20)
44
mythz

これがSwift 4.2でのやり方です。

extension Date {

    /// Create a date from specified parameters
    ///
    /// - Parameters:
    ///   - year: The desired year
    ///   - month: The desired month
    ///   - day: The desired day
    /// - Returns: A `Date` object
    static func from(year: Int, month: Int, day: Int) -> Date? {
        let calendar = Calendar(identifier: .gregorian)
        var dateComponents = DateComponents()
        dateComponents.year = year
        dateComponents.month = month
        dateComponents.day = day
        return calendar.date(from: dateComponents) ?? nil
    }
}

使用法:

let marsOpportunityLaunchDate = Date.from(year: 2003, month: 07, day: 07)
7
Adrian

によると アップルのドキュメント

例:

var myObject = NSDate()
let futureDate = myObject.dateByAddingTimeInterval(10)
let timeSinceNow = myObject.timeIntervalSinceNow
4
Kevin Machado

Swift 3.0では、この方法で日付オブジェクトを設定しました。

extension Date
{
    init(dateString:String) {
        let dateStringFormatter = DateFormatter()
        dateStringFormatter.dateFormat = "yyyy-MM-dd"
        dateStringFormatter.locale = Locale(identifier: "en_US_POSIX")
        let d = dateStringFormatter.date(from: dateString)!
        self(timeInterval:0, since:d)
    }
}
4
Jaydip

個人的には私はそれが失敗しやすい初期化するべきだと思います:

extension Date {

    init?(dateString: String) {
        let dateStringFormatter = DateFormatter()
        dateStringFormatter.dateFormat = "yyyy-MM-dd"
        if let d = dateStringFormatter.date(from: dateString) {
            self.init(timeInterval: 0, since: d)
        } else {
            return nil
        }
    }
}

そうでなければ、無効なフォーマットの文字列は例外を発生させます。

2
Leon

@mythzの回答によると、私はSwift3構文を使って彼の拡張の更新版を投稿することにしました。

extension Date {
    static func from(_ year: Int, _ month: Int, _ day: Int) -> Date?
    {
        let gregorianCalendar = Calendar(identifier: .gregorian)
        let dateComponents = DateComponents(calendar: gregorianCalendar, year: year, month: month, day: day)
        return gregorianCalendar.date(from: dateComponents)
    }
}

私はparseメソッドを使いませんが、誰かが必要ならば、この記事を更新します。

2
Hamsternik

ある場所の日付値と別の場所の日付値を組み合わせる必要があることがよくあります。これを実現するためのヘルパー関数を書きました。

let startDateTimeComponents = NSDateComponents()
startDateTimeComponents.year = NSCalendar.currentCalendar().components(NSCalendarUnit.Year, fromDate: date).year
startDateTimeComponents.month = NSCalendar.currentCalendar().components(NSCalendarUnit.Month, fromDate: date).month
startDateTimeComponents.day = NSCalendar.currentCalendar().components(NSCalendarUnit.Day, fromDate: date).day
startDateTimeComponents.hour = NSCalendar.currentCalendar().components(NSCalendarUnit.Hour, fromDate: time).hour
startDateTimeComponents.minute = NSCalendar.currentCalendar().components(NSCalendarUnit.Minute, fromDate: time).minute
let startDateCalendar = NSCalendar(identifier: NSCalendarIdentifierGregorian)
combinedDateTime = startDateCalendar!.dateFromComponents(startDateTimeComponents)!
1
Justin Domnitz