programing

Swift Date 객체를 작성하려면 어떻게 해야 합니까?

oldcodes 2023. 4. 14. 22:05
반응형

Swift Date 객체를 작성하려면 어떻게 해야 합니까?

swift xcode의 날짜에서 날짜 개체를 만들려면 어떻게 해야 합니까?

예를 들어 javascript에서는 다음을 수행합니다.var day = new Date('2014-05-20');

Swift는 자신의 것을 가지고 있다.Datetype. 사용할 필요가 없습니다.NSDate.

Swift에서 날짜 및 시간 생성

Swift에서는 날짜 및 시간은 기준 날짜 2001년 1월 1일 00:00:00 UTC 이후의 초수를 측정하는 64비트 부동 소수점 숫자로 저장됩니다.이것은 구조에서 표현된다.현재 날짜와 시간은 다음과 같습니다.

let currentDateTime = Date()

다른 날짜 시간을 작성할 경우 다음 방법 중 하나를 사용할 수 있습니다.

방법 1

2001 참조일 전후의 초수를 알고 있는 경우는, 그것을 사용할 수 있습니다.

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

방법 2

물론, (상대적인 초보다) 년, 월, 일, 시간 같은 것을 사용하는 것이 더 쉬울 것입니다.Date이 경우,DateComponents컴포넌트를 지정하고Calendar날짜를 만듭니다.Calendar를 주다Date맥락.그렇지 않으면 어떤 시간대나 달력에 표현해야 하는지 어떻게 알 수 있을까요?

// 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(identifier: .gregorian) // since the components above (like year 1980) are for Gregorian
let someDateTime = userCalendar.date(from: dateComponents)

다른 시간대 약어는 여기에서 찾을 수 있습니다.이 값을 공백으로 두면 기본적으로 사용자의 표준 시간대가 사용됩니다.

방법 3

가장 간결한 방법(최선은 아니지만)은DateFormatter.

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

Unicode 기술 표준에는 다음과 같은 다른 형식이 있습니다.DateFormatter서포트하고 있습니다.

메모들

날짜와 시간을 읽을 수 있는 형식으로 표시하는 방법에 대한 전체 답변을 참조하십시오.또, 다음의 훌륭한 기사도 읽어 주세요.

이 작업은 기존 확장 기능을 사용하여 수행하는 것이 가장 좋습니다.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를 캐시하지 않습니다.이러한 작업은 퍼포먼스상의 이유로 많은 데이터를 생성할 수 있습니다.NSDates는 다음과 같습니다.

또, 이 실장에서는, 이 머신을 초기화하려고 하면, 간단하게 크래쉬 하는 것에 주의해 주세요.NSDate올바르게 구문 분석할 수 없는 문자열을 전달합니다.은, 「」가하는 옵션의 것입니다.dateFromString </FONT CHANGE:/FONT CHANGE: </FONT CHANGE:>nil잘못된 구문 분석에서는 이상적으로는 고장 가능한 이니셜라이저를 사용할 수 있지만, Swift 1.2의 제한으로 인해 지금은(2015년 6월) 사용할 수 없으므로 클래스 팩토리 방식을 사용하는 것이 가장 좋습니다.

두 가지 문제를 모두 해결하는 보다 자세한 예는 https://gist.github.com/algal/09b08515460b7bd229fa 입니다.


Swift 5 업데이트

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

타입은, 의 Coco Swift Date를 .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)

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)

Apple의 설명서에 따르면

예:

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

@회답에 는 @mythz의 을 @mythz, @mythz, @mythz, @mythz, @mythz, @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방법이지만 누군가 필요하다면 이 게시물을 업데이트하겠습니다.

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)
    }
}

Apple의 데이터 포맷 가이드에 따라

날짜 포맷을 만드는 것은 비용이 많이 드는 작업이 아닙니다.포메터를 자주 사용하는 경우에는 일반적으로 여러 인스턴스를 만들고 삭제하는 것보다 단일 인스턴스를 캐시하는 것이 더 효율적입니다.한 가지 방법은 정적 변수를 사용하는 것입니다.

@하는 것이 그럴('@Leon'이 있는 처럼).UIImage(imageLiteralResourceName:)리소스가 존재하지 않으면 크래시됩니다).

제 접근방식은 다음과 같습니다.

extension DateFormatter {
  static let yyyyMMdd: DateFormatter = {
    let formatter = DateFormatter()
    formatter.dateFormat = "yyyy-MM-dd"
    formatter.calendar = Calendar(identifier: .iso8601)
    formatter.timeZone = TimeZone(secondsFromGMT: 0)
    formatter.locale = Locale(identifier: "en_US_POSIX")
    return formatter
  }()
}

extension Date {
    init?(yyyyMMdd: String) {
        guard let date = DateFormatter.yyyyMMdd.date(from: yyyyMMdd) else { return nil }
        self.init(timeInterval: 0, since: date)
    }

    init(dateLiteralString yyyyMMdd: String) {
        let date = DateFormatter.yyyyMMdd.date(from: yyyyMMdd)!
        self.init(timeInterval: 0, since: date)
    }
}

이제 전화만 하면 됩니다.

// For cases where the date exists for sure (eg. seed data)
Date(dateLiteralString: "2020-03-30")

// The rest of the time (eg. parsing unknown data)
guard let date = Date(yyyyMMdd: "2020-03-30") else { return nil }

개인적으로 나는 이것이 실패할 수 있는 이니셜라이저라고 생각한다.

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
        }
    }
}

그렇지 않으면 잘못된 형식의 문자열이 예외를 발생시킵니다.

한 장소의 날짜 값과 다른 장소의 시간 값을 조합해야 하는 경우가 많습니다.이를 위해 도우미 함수를 작성했습니다.

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)!

iOS15, Xcode 13에서는 다음과 같은 간단한 날짜도 작성할 수 있습니다.

let date = try? Date("2022-02-14T20:15:00Z", strategy: .iso8601)

다음과 같은 커스텀 초기화 기능을 작성할 수 있습니다.

extension Date {
    init(month: Int, day: Int, year: Int, hour: Int = 0, minute: Int = 0, second: Int = 0) {
        var dateComponents = DateComponents()
        dateComponents.month = month
        dateComponents.day = day
        dateComponents.year = year
        dateComponents.hour = hour
        dateComponents.minute = minute
        dateComponents.second = second
        dateComponents.timeZone = .current
        dateComponents.calendar = .current
        self = Calendar.current.date(from: dateComponents) ?? Date()
    }
}

사용방법:

let date = Date(month: 5, day: 20, year: 2014)

언급URL : https://stackoverflow.com/questions/24089999/how-do-you-create-a-swift-date-object

반응형