Chuyển đổi chuỗi thành ngày trong Swift


136

Làm cách nào tôi có thể chuyển đổi chuỗi này "2016-04-14T10:44:00+0000"thành một NSDatevà chỉ giữ năm, tháng, ngày, giờ?

Tgiữa của nó thực sự ném đi những gì tôi đã quen khi làm việc với ngày.


Bạn muốn chỉ Năm, tháng, ngày, giờ phải không?
Mitul Marsoniya

Bản sao có thể có của Từ Chuỗi sang NSDate trong Swift
Fogmeister

Câu trả lời:


231
  • Chuyển đổi chuỗi ISO8601 thành ngày

    let isoDate = "2016-04-14T10:44:00+0000"
    
    let dateFormatter = DateFormatter()
    dateFormatter.locale = Locale(identifier: "en_US_POSIX") // set locale to reliable US_POSIX
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
    let date = dateFormatter.date(from:isoDate)!
    
  • Lấy các thành phần ngày cho năm, tháng, ngày và giờ kể từ ngày

    let calendar = Calendar.current
    let components = calendar.dateComponents([.year, .month, .day, .hour], from: date)
    
  • Cuối cùng tạo một Dateđối tượng mới và tước phút và giây

    let finalDate = calendar.date(from:components)

Cũng xem xét định dạng tiện lợi được ISO8601DateFormattergiới thiệu trong iOS 10 / macOS 12:

let isoDate = "2016-04-14T10:44:00+0000"

let dateFormatter = ISO8601DateFormatter()
let date = dateFormatter.date(from:isoDate)!

3
chữ Z trong "yyyy-MM-dd'THHH: mm: ssZ" đã giải quyết những gì không hiệu quả với tôi
asheyla

Tôi chỉ muốn năm tháng và ngày, nhưng điều này không hiệu quả với tôi
Sneha

@Sneha Nếu bạn không muốn giờ chỉ cần bỏ qua.hour
vadian

@vadian Tôi đã làm nhưng tôi không nhận được
Sneha

1
Tất cả trong một: ISO8601DateFormatter (). Ngày (từ: "chuỗi của bạn")!
Mike Irving

38

Hãy thử định dạng ngày sau.

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ssZZZ"
let date = dateFormatter. dateFromString (strDate)

Hy vọng nó giúp..

Swift 4.1:

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ssZZZ"
let date = dateFormatter.date(from: strDate)

10
Đã thử nó, và ngày trở lại con số không sau này.
asheyla

1
Không thể chuyển đổi giá trị của loại 'Chuỗi' thành loại 'Ngày' trong cưỡng chế
Oleksandr

22

Trong Swift 4.1 bạn có thể làm:

func getDate() -> Date? {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
    dateFormatter.timeZone = TimeZone.current
    dateFormatter.locale = Locale.current
    return dateFormatter.date(from: "2015-04-01T11:42:00") // replace Date String
}

16

Swift 3.0 - 4.2

import Foundation

extension String {

    func toDate(withFormat format: String = "yyyy-MM-dd HH:mm:ss")-> Date?{

        let dateFormatter = DateFormatter()
        dateFormatter.timeZone = TimeZone(identifier: "Asia/Tehran")
        dateFormatter.locale = Locale(identifier: "fa-IR")
        dateFormatter.calendar = Calendar(identifier: .gregorian)
        dateFormatter.dateFormat = format
        let date = dateFormatter.date(from: self)

        return date

    }
}

extension Date {

    func toString(withFormat format: String = "EEEE ، d MMMM yyyy") -> String {

        let dateFormatter = DateFormatter()
        dateFormatter.locale = Locale(identifier: "fa-IR")
        dateFormatter.timeZone = TimeZone(identifier: "Asia/Tehran")
        dateFormatter.calendar = Calendar(identifier: .persian)
        dateFormatter.dateFormat = format
        let str = dateFormatter.string(from: self)

        return str
    }
}

9

Xin chào Bạn có Định dạng T riêng biệt và sau đó chuyển đổi theo ý muốn

// create dateFormatter with UTC time format
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
dateFormatter.timeZone = NSTimeZone(name: "UTC")
let date = dateFormatter.dateFromString("2015-04-01T11:42:00")

// change to a readable time format and change to local time zone
dateFormatter.dateFormat = "EEE, MMM d, yyyy - h:mm a"
dateFormatter.timeZone = NSTimeZone.localTimeZone() 
let timeStamp = dateFormatter.stringFromDate(date!)

6

Chỉ cần bạn vượt qua dateformatevà ngày của bạn sau đó bạn nhận được Year,month,day,hour. Thông tin thêm

func GetOnlyDateMonthYearFromFullDate(currentDateFormate:NSString , conVertFormate:NSString , convertDate:NSString ) -> NSString
    {
        let dateFormatter = NSDateFormatter()
        dateFormatter.dateFormat = currentDateFormate as String
        let formatter = NSDateFormatter()
        formatter.dateFormat = Key_DATE_FORMATE as String
        let finalDate = formatter.dateFromString(convertDate as String)
        formatter.dateFormat = conVertFormate as String
        let dateString = formatter.stringFromDate(finalDate!)

        return dateString
    }


Nhận năm

let Year = self.GetOnlyDateMonthYearFromFullDate("yyyy-MM-dd'T'HH:mm:ssZ", conVertFormate: "YYYY", convertDate: "2016-04-14T10:44:00+0000") as String


Nhận tháng

let month = self.GetOnlyDateMonthYearFromFullDate("yyyy-MM-dd'T'HH:mm:ssZ", conVertFormate: "MM", convertDate: "2016-04-14T10:44:00+0000") as String


Nhận ngày

let day = self.GetOnlyDateMonthYearFromFullDate("yyyy-MM-dd'T'HH:mm:ssZ", conVertFormate: "dd", convertDate: "2016-04-14T10:44:00+0000") as String


Nhận giờ

let hour  = self.GetOnlyDateMonthYearFromFullDate("yyyy-MM-dd'T'HH:mm:ssZ", conVertFormate: "hh", convertDate: "2016-04-14T10:44:00+0000") as String

4

làm cho chức năng toàn cầu

func convertDateFormat(inputDate: String) -> String {

     let olDateFormatter = DateFormatter()
     olDateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"

     let oldDate = olDateFormatter.date(from: inputDate)

     let convertDateFormatter = DateFormatter()
     convertDateFormatter.dateFormat = "MMM dd yyyy h:mm a"

     return convertDateFormatter.string(from: oldDate!)
}

Hàm được gọi và chuyển giá trị trong nó

get_OutputStr = convertDateFormat(inputDate: "2019-03-30T05:30:00+0000")

và đây là đầu ra

Feb 25 2020 4:51 PM



 

1
Bạn có nghĩ rằng đầu vào và đầu ra của bạn giống nhau không?
Thợ mộc Deepak

2

Trong swift4,

    var Msg_Date_ = "2019-03-30T05:30:00+0000"

    let dateFormatterGet = DateFormatter()
    dateFormatterGet.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
    let dateFormatterPrint = DateFormatter()
    dateFormatterPrint.dateFormat = "MMM dd yyyy h:mm a"  //"MMM d, h:mm a" for  Sep 12, 2:11 PM
    let datee = dateFormatterGet.date(from: Msg_Date_)
    Msg_Date_ =  dateFormatterPrint.string(from: datee ?? Date())

    print(Msg_Date_)

// đầu ra: - 30 tháng 3 năm 2019 05:30 PM


2

chỉ cần Bước 1> nhận giá trị Chuỗi từ JSON hoặc dataSource

Bước 2> tạo một biến cục bộ và gán nó.

let startDate = CurrentDashBoard.startdate

Bước 3> tạo một thể hiện của DateFormatter.

let dateFormatter = DateFormatter()

bước 4> gọi dateFormat từ dateFormatter và cung cấp dataType ngày lưu.

dateFormatter.dateFormat = "MM-dd-yyyy HH:mm:ss"("may be String formate")

Bước 5> Gán biến Local cho biến này để chuyển đổi.

let dateFromStringstartDate : NSDate = dateFormatter.date(from: startDate)! as NSDate

Bước 6> cung cấp ngày yêu cầu của bạn Formate theo mã sau đây.

dateFormatter.dateFormat = "MM/dd/yyyy HH:mm:ss"

Bước 6> Gán nó vào nhãn / văn bản

cell.lblStartDate.text = String(format: "%@", strstartDate)

Mã số:

let startDate = CurrentDashBoard.startdate let dateFormatter = DateFormatter() 
dateFormatter.dateFormat = "MM-dd-yyyy HH:mm:ss" let dateFromStringstartDate : 
NSDate = dateFormatter.date(from: startDate)! as NSDate
dateFormatter.dateFormat = "MM/dd/yyyy HH:mm:ss"
let strstartDate = dateFormatter.string(from: dateFromStringstartDate as Date)

1

Swift 5. Để xem NẾU MỘT NGÀY ĐÃ THAM GIA:

let expiryDate = "2020-01-10" // Jan 10 2020

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"

if Date() < dateFormatter.date(from: expiryDate) ?? Date() {
    print("Not Yet expiryDate")
} else {
    print("expiryDate has passed")
}

1

Tôi đã trở nên điên rồ với định dạng này là tốt.

Xem giải pháp dưới đây.

Chuỗi của bạn xuất phát từ lưng hoặc nguồn khác:

    let isoDate = "2020-05-06 20:00:00-03"

Xác định định dạng ngày

    let dateFormatter = DateFormatter()
    dateFormatter.locale = Locale(identifier: "en_US_POSIX")
    dateFormatter.dateFormat = "yyyy-MM-dd' 'HH:mm:ssZ"
    let date = dateFormatter.date(from:isoDate)!

Bây giờ bạn có ngày là Ngày (), bạn có thể thay đổi thành bất kỳ định dạng nào bạn muốn bằng cách sử dụng formatDate.opes

    let formatDate = DateFormatter()
    formatDate.dateFormat = "dd/MM/yyyy HH:mm"
    let drawDate = formatDate.string(from: date)
    print(drawDate)

Đầu ra:

    06/05/2020 20:00

0

Vui lòng sử dụng thư viện phân tích cú pháp ISO8601 để làm điều này. Có quá nhiều cách để chuỗi được mã hóa. Đừng dựa vào một định dạng cụ thể và đừng dựa vào máy chủ luôn gửi giống nhau. Các vấn đề bắt đầu với 'Z' ở cuối và nó sẽ mở rộng thông qua tất cả các loại tiêu chuẩn. Một thư viện phân tích cú pháp sẽ xử lý tất cả các trường hợp và sẽ luôn cung cấp một chuyển đổi an toàn - trong khi đó một chuỗi định dạng cố định có thể sẽ thất bại trong tương lai.

Bạn có thể sử dụng một trong những thư viện này. Chúng cũng có sẵn trên CococaPods:

https://github.com/boredzo/iso-8601-date-formatter/

https://github.com/malcommac/SwiftDate

Hãy nhìn vào việc thực hiện. Cả hai đều dài vài trăm dòng - vì lý do chính đáng.

Liên quan đến câu hỏi: Bạn có thể lấy các thành phần ngày từ ngày bằng NSDateComponents. Ví dụ trên trang web bao gồm chính xác trường hợp của bạn.

https://developer.apple.com/documentation/foundation/nscalWiki/1414841-components?lingu=objc

Xin lưu ý rằng việc chuyển đổi ngày của bạn sẽ tính đến múi giờ. Bạn có thể muốn đặt 'ngôn ngữ' của NSCalWiki một cách rõ ràng.


0

Chỉ cần sử dụng SwifterSwift.

stringDate = "2020-04-26T08:56:17.987Z"
let date = Date(iso8601String: stringDate)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.