迅速に現在の時間に分を追加する方法


109

私はSwiftを初めて使い、スケジューラーを試しています。開始時刻を選択していて、開始時刻に5分(またはその倍数)を追加してUILabelに表示する必要がありますか?

    @IBAction func timePickerClicked(sender: UIDatePicker) {
    var dateFormatter = NSDateFormatter()
    dateFormatter.timeStyle = NSDateFormatterStyle.ShortStyle
    var dateStr = dateFormatter.stringFromDate(startTime.date)
    let sttime = dateStr
    startTimeDisplay.text = dateStr
    }

   // How to advance time by 5 minutes for each section based on the   start time selected and display time 
   // section 1 = start time + 5
   // section 2 = start time + 10*

回答:


271

2つのアプローチ:

  1. とを使用Calendardate(byAdding:to:wrappingComponents:)ます。たとえば、Swift 3以降の場合:

    let calendar = Calendar.current
    let date = calendar.date(byAdding: .minute, value: 5, to: startDate)
    
  2. +演算子(を参照+(_:_:))を使用してa TimeInterval(つまり、特定の秒数)を追加するだけです。たとえば、5分追加すると、次のことができます。

    let date = startDate + 5 * 60

    (注:順序はここで特定されます:の左側に日付+、右側に秒。)

    必要addingTimeIntervalに応じて、を使用することもできます。

    let date = startDate.addingTimeInterval(5 * 60)

ボトムラインは、+/ addingTimeInterval簡単なシナリオの最も簡単ですが、あなたがこれまでより大きな単位(例えば、日、月、など)を追加したい場合は、それらが夏時間を調整するので、一方、あなたはおそらく、暦の計算を使用したいと思うaddingTimeIntervalしません。


Swift 2レンディションについては、この回答の以前のリビジョンを参照してください。


これらの2つのアプローチのうち、パフォーマンスが高いのはどれですか。additionalTimeIntervalまたはcalendar.date(byAdding ...
Nishant

3
addingTimeInterval(あなたは時間のこの何百万人をやっている場合を除きしかしそうではない材料)間違いなくよりパフォーマンスです。ただし、より重要なのは、日単位(またはそれ以上)の測定単位について話している場合は、夏時間の調整をすべて行うので、カレンダーレンディションの方が適しています。
Rob

40

カレンダーの方法を使用できます

func date(byAdding component: Calendar.Component, value: Int, to date: Date, wrappingComponents: Bool = default) -> Date?

any Calendar.Componentをany に追加しますDate。日付拡張を作成して、の日付にx分を追加できUIDatePickerます。

Xcode 8およびXcode 9•Swift 3.0およびSwift 4.0

extension Date {
    func adding(minutes: Int) -> Date {
        return Calendar.current.date(byAdding: .minute, value: minutes, to: self)!
    }
}

次に、拡張メソッドを使用して、送信者に分を追加することができます(UIDatePicker)。

let section1 = sender.date.adding(minutes: 5)
let section2 = sender.date.adding(minutes: 10)

遊び場のテスト:

Date().adding(minutes: 10)  //  "Jun 14, 2016, 5:31 PM"

どのような状況で.date(byAdding:value:to)復帰しnilますか?ここでアンラップを強制しても安全ですか?
Declan McKenna 2018年

@Deco日付に分を追加するとnilが返されますか?結果の日付で世界が終わらない場合は、安全です:)
レオダバス

2
ドキュメントがこれがnilを返すことができる方法については明確ではありません。この質問はそれを説明します、あなたは正しい、ここで完全に安全です。stackoverflow.com/questions/39358131/…–
Declan McKenna

21

Swift 4

//日付に5分追加します

let date = startDate.addingTimeInterval(TimeInterval(5.0 * 60.0))

//日付か​​ら5分を差し引きます

let date = startDate.addingTimeInterval(TimeInterval(-5.0 * 60.0))

Swift 5.1:

// subtract 5 minutes from date
transportationFromDate.addTimeInterval(TimeInterval(-5.0 * 60.0))

4

を使用して日付の計算を行うことができますNSDateComponents。例えば:

import Foundation

let comps = NSDateComponents()

comps.minute = 5

let cal = NSCalendar.currentCalendar()

let r = cal.dateByAddingComponents(comps, toDate: NSDate(), options: nil)

遊び場で試してみると

ここに画像の説明を入力してください


4

NSDate.initwith timeIntervalSinceNow
例:

 let dateAfterMin = NSDate.init(timeIntervalSinceNow: (minutes * 60.0))

4

この小さな拡張機能を保存します。

extension Int {

 var seconds: Int {
    return self
 }

 var minutes: Int {
    return self.seconds * 60
 }

 var hours: Int {
    return self.minutes * 60
 }

 var days: Int {
    return self.hours * 24
 }

 var weeks: Int {
    return self.days * 7
 }

 var months: Int {
    return self.weeks * 4
 }

 var years: Int {
    return self.months * 12
 }
}

次に、次のように直感的に使用します。

let threeDaysLater = TimeInterval(3.days)
date.addingTimeInterval(threeDaysLater)

2
残念ながら、月と年は正しくありません。7 * 4 * 12 = 336、これは365よりはるかに少ない
。– KlimczakM

1
次のように月数を計算しself.days * 30、年数を計算することで改善できますself.days * 365。年は366日、月は30日と異なる場合があるため、これは完全ではありませんが、28/336よりも優れています。
KlimczakM

2
上記のすべての理由から、これを使用するべきではありません。さまざまなケースで不正確です。組み込みのデータ演算機能を使用する
Steven Stefanik

1
月は常に4週間とは限りません。これでうるう年はどうですか?
Mehdi Chennoufi

3

迅速な4または5で使用できます

    let date = Date()
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd H:mm:ss"
    let current_date_time = dateFormatter.string(from: date)
    print("before add time-->",current_date_time)

    //adding 5 miniuts
    let addminutes = date.addingTimeInterval(5*60)
    dateFormatter.dateFormat = "yyyy-MM-dd H:mm:ss"
    let after_add_time = dateFormatter.string(from: addminutes)
    print("after add time-->",after_add_time)

出力:

before add time--> 2020-02-18 10:38:15
after add time--> 2020-02-18 10:43:15

2

スウィフト3:

let minutes: TimeInterval = 1 * 60
let nowPlusOne = Date() + minutes

0

UNIXタイムスタンプが必要な場合

        let now : Date = Date()
        let currentCalendar : NSCalendar = Calendar.current as NSCalendar

        let nowPlusAddTime : Date = currentCalendar.date(byAdding: .second, value: accessTime, to: now, options: .matchNextTime)!

        let unixTime = nowPlusAddTime.timeIntervalSince1970

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.