신속하게 현재 시간에 분을 추가하는 방법


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

두 가지 접근 방식 :

  1. 사용 Calendar하고 date(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 변환 의 경우이 답변이전 개정판을 참조하십시오 .


다음 두 가지 접근 방식 중 어느 것이 더 성능이 좋습니까? addingTimeInterval 또는 calendar.date (byAdding ...
Nishant

3
addingTimeInterval(당신이 시간의 수백만을하는 경우가 아니라면 비록 가능성이 중요하지) 의심 할 여지없이 더 성능이 좋은 것입니다. 그러나 더 중요한 것은 측정 단위에 대해 일 단위 (또는 그 이상)에 대해 이야기하는 경우 모든 일광 절약 시간 조정을 수행하므로 달력 변환이 더 바람직하다는 것입니다.
Rob

40

캘린더의 방법을 사용할 수 있습니다.

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

어떤 추가 Calendar.Component어느를 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

@Deco 날짜에 분을 추가하면 어떻게 nil이 반환됩니까? 세상이 결과 날짜 끝날 때가되지 않으면 안전 :)입니다
레오 버스들이시길

2
이것이 nil을 반환하는 방법에 대한 문서는 명확하지 않습니다. 이 질문은 그것을 설명합니다. 당신이 맞아요. 여기에서 완전히 안전합니다. stackoverflow.com/questions/39358131/...
클랜 맥 케나에게

21

스위프트 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.init와 함께 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
불행히도 월과 년은 정확하지 않습니다. 336 = 7 * 12 * 4이 훨씬 덜보다 365
KlimczakM

1
다음 self.days * 30과 같이 월을 계산하여 개선 할 수 있습니다. 및 연도 : self.days * 365. 1 년에 366 일이있을 수 있고 월이 30 일과 다를 수 있기 때문에 완벽하지는 않지만 여전히 28/336보다 낫습니다.
KlimczakM

2
위에 나열된 모든 이유로 이것을 사용해서는 안되며, 여러 가지 경우에서 정확하지 않습니다. 내장 데이터 연산 기능 사용
스티븐 스테파니

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

유닉스 타임 스탬프를 원하는 경우

        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.