Định dạng ngày trong Swift


150

Làm thế nào tôi sẽ chuyển đổi datetime này kể từ ngày?

Từ đây: 2016 / 02-29 12:24:26
đến: ngày 29 tháng 2 năm 2016

Cho đến nay, đây là mã của tôi và nó trả về giá trị không:

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "MM-dd-yyyy"
dateFormatter.timeZone = NSTimeZone(name: "UTC")
let date: NSDate? = dateFormatter.dateFromString("2016-02-29 12:24:26")
print(date)

Câu trả lời:


267

Bạn phải khai báo 2 khác nhau NSDateFormatters, lần đầu tiên để chuyển đổi chuỗi thành a NSDatevà lần thứ hai để in ngày theo định dạng của bạn.
Hãy thử mã này:

let dateFormatterGet = NSDateFormatter()
dateFormatterGet.dateFormat = "yyyy-MM-dd HH:mm:ss"

let dateFormatterPrint = NSDateFormatter()
dateFormatterPrint.dateFormat = "MMM dd,yyyy"

let date: NSDate? = dateFormatterGet.dateFromString("2016-02-29 12:24:26")
print(dateFormatterPrint.stringFromDate(date!))

Swift 3 trở lên:

Từ Swift 3 NSDatelớp đã được thay đổi DateNSDateFormatterphải DateFormatter.

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

let dateFormatterPrint = DateFormatter()
dateFormatterPrint.dateFormat = "MMM dd,yyyy"

if let date = dateFormatterGet.date(from: "2016-02-29 12:24:26") {
    print(dateFormatterPrint.string(from: date))
} else {
   print("There was an error decoding the string")
}

1
Điều gì xảy ra nếu dateFormatterGet dateFormat cần chấp nhận 2 định dạng khác nhau - một định dạng chứa mili giây và một không có mili giây? tức là yyyy-MM-dd'T'HH: mm: ssZZZZZ và yyyy-MM-dd'T'HH: mm: ss: SSSZZZZZ
KvnH

1
Tôi nghĩ rằng bạn phải khai báo hai DateFormatters khác nhau để có được ngày: nếu cái đầu tiên không thành công (nó sẽ trả về con số không), hãy sử dụng cái thứ hai.
LorenzOliveto

Bạn có thể vui lòng giúp tôi không, định dạng ngày cho "Thứ ba ngày 12 tháng 12 năm 2019 12:00:00 GMT-0500 (CDT)"
Devesh

@Devesh nó phải là một cái gì đó như thế này "EEE MMM d yyyy HH: mm: ss ZZZZ", hãy xem nsdateformatter.com đây là một trang web rất hay với tất cả các định dạng được hỗ trợ
LorenzOliveto

@lorenzoliveto vâng Tôi cũng đã thử mọi cách cho định dạng này. Tôi cũng đã thử trên nsdateformatter.com, tôi vẫn không thể nhận được bất cứ điều gì cho "Tue Mar 12 2019 12:00:00 GMT-0500 (CDT)" định dạng này. Tôi nhận được định dạng này trong JSON. Tôi không chắc đây là chuỗi hợp lệ, bạn có thể vui lòng giúp tôi không.
Devesh

211

Điều này có thể hữu ích cho những ai muốn sử dụng dateformater.dateformat; nếu bạn muốn 12.09.18bạn sử dụngdateformater.dateformat = "dd.MM.yy"

Wednesday, Sep 12, 2018           --> EEEE, MMM d, yyyy
09/12/2018                        --> MM/dd/yyyy
09-12-2018 14:11                  --> MM-dd-yyyy HH:mm
Sep 12, 2:11 PM                   --> MMM d, h:mm a
September 2018                    --> MMMM yyyy
Sep 12, 2018                      --> MMM d, yyyy
Wed, 12 Sep 2018 14:11:54 +0000   --> E, d MMM yyyy HH:mm:ss Z
2018-09-12T14:11:54+0000          --> yyyy-MM-dd'T'HH:mm:ssZ
12.09.18                          --> dd.MM.yy
10:41:02.112                      --> HH:mm:ss.SSS

2
Câu trả lời của bạn đã được chiếu sáng và khắc phục vấn đề của tôi. Cảm ơn bạn.
andrewcar 18/03/19

50

Swift 3 trở lên

let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
dateFormatter.timeStyle = .none
dateFormatter.locale = Locale(identifier: "en_US")
print(dateFormatter.string(from: date)) // Jan 2, 2001

Điều này cũng hữu ích khi bạn muốn bản địa hóa Ứng dụng của mình. Địa điểm (định danh :) sử dụng Mã ISO 639-1 . Xem thêm Tài liệu Apple


8
Nếu bạn muốn bản địa hóa ứng dụng của mình, chỉ cần sử dụng Locale.currentđể sử dụng ngôn ngữ của người dùng.
Victor Engel

45

Swift - 5.0

let date = Date()
let formate = date.getFormattedDate(format: "yyyy-MM-dd HH:mm:ss") // Set output formate

extension Date {
   func getFormattedDate(format: String) -> String {
        let dateformat = DateFormatter()
        dateformat.dateFormat = format
        return dateformat.string(from: self)
    }
}

Swift - 4.0

2018-02-01T19: 10: 04 + 00: 00 Chuyển đổi ngày 01 tháng 2 năm 2018

extension Date {
    static func getFormattedDate(string: String , formatter:String) -> String{
        let dateFormatterGet = DateFormatter()
        dateFormatterGet.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"

        let dateFormatterPrint = DateFormatter()
        dateFormatterPrint.dateFormat = "MMM dd,yyyy"

        let date: Date? = dateFormatterGet.date(from: "2018-02-01T19:10:04+00:00")
        print("Date",dateFormatterPrint.string(from: date!)) // Feb 01,2018
        return dateFormatterPrint.string(from: date!);
    }
}

36

Phiên bản Swift 3 với Dateđối tượng mới thay thế NSDate:

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

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MMM dd,yyyy"

let date: Date? = dateFormatterGet.date(from: "2017-02-14 17:24:26")
print(dateFormatter.string(from: date!))

EDIT: sau khi đề nghị mitul-nakum


2
dateFormatterGet.dateFormat = "yyyy-MM-dd HH: mm: ss" định dạng giờ sẽ yêu cầu vốn HH, vì giờ là trong 24 formate
Mitul Nakum

22

nhanh 3

let date : Date = Date()
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MMM dd, yyyy"
let todaysDate = dateFormatter.string(from: date)

16

Tôi đã giải quyết vấn đề của mình theo định dạng yyyy-MM-dd'T'HH:mm:ss.SSS'Z'(ví dụ: 2018-06-15T00: 00: 00.000Z) bằng cách này:

func formatDate(date: String) -> String {
   let dateFormatterGet = DateFormatter()
   dateFormatterGet.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"

   let dateFormatter = DateFormatter()
   dateFormatter.dateStyle = .medium
   dateFormatter.timeStyle = .none
   //    dateFormatter.locale = Locale(identifier: "en_US") //uncomment if you don't want to get the system default format.

   let dateObj: Date? = dateFormatterGet.date(from: date)

   return dateFormatter.string(from: dateObj!)
}

9

Swift 3 với Datephần mở rộng

extension Date {
    func string(with format: String) -> String {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = format
        return dateFormatter.string(from: self)
    }
}

Sau đó, bạn có thể sử dụng nó như vậy:

let date = Date()
date.string(with: "MMM dd, yyyy")

8

Swift 4, 4.2 và 5

func getFormattedDate(date: Date, format: String) -> String {
        let dateformat = DateFormatter()
        dateformat.dateFormat = format
        return dateformat.string(from: date)
}

let formatingDate = getFormattedDate(date: Date(), format: "dd-MMM-yyyy")
        print(formatingDate)

1
Đây là một giải pháp tốt, ngắn chỉ với một lần duy nhất DateFormatter()! Một điều cần lưu ý: Việc này DateFormattercũng đưa khu vực ứng dụng (được đặt trong sơ đồ) vào tài khoản! Ví dụ 2019-05-27 11:03:03 +0000với định dạng yyyy-MM-dd HH:mm:ssvà "Đức" khi khu vực biến thành 2019-05-27 13:03:03. Sự khác biệt này là do DST: Vào mùa hè, Đức là GMT + 2, trong khi vào mùa đông, đó là GMT + 1.
Neph

4

Nếu bạn muốn phân tích ngày từ "1996-12-19T16: 39: 57-08: 00", hãy sử dụng định dạng sau "yyyy-MM-dd'T'HH: mm: ssZZZZZ":

let RFC3339DateFormatter = DateFormatter()
RFC3339DateFormatter.locale = Locale(identifier: "en_US_POSIX")
RFC3339DateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ"
RFC3339DateFormatter.timeZone = TimeZone(secondsFromGMT: 0)

/* 39 minutes and 57 seconds after the 16th hour of December 19th, 1996 with an offset of -08:00 from UTC (Pacific Standard Time) */
let string = "1996-12-19T16:39:57-08:00"
let date = RFC3339DateFormatter.date(from: string)

từ Apple https://developer.apple.com/documentation/foundation/dateformatter


3

Một khả năng khác của ngày định dạng. Ảnh chụp màn hình này thuộc về Ứng dụng "Tin tức" của Apple.

Ảnh chụp màn hình ứng dụng

Đây là mã:

let dateFormat1 = DateFormatter()
dateFormat1.dateFormat = "EEEE"
let stringDay = dateFormat1.string(from: Date())

let dateFormat2 = DateFormatter()
dateFormat2.dateFormat = "MMMM"
let stringMonth = dateFormat2.string(from: Date())

let dateFormat3 = DateFormatter()
dateFormat3.dateFormat = "dd"
let numDay = dateFormat3.string(from: Date())

let stringDate = String(format: "%@\n%@ %@", stringDay.uppercased(), stringMonth.uppercased(), numDay)

Không có gì để thêm vào thay thế được đề xuất bởi lorenzoliveto. Nó thật hoàn hảo.

let dateFormat = DateFormatter()
dateFormat.dateFormat = "EEEE\nMMMM dd"
let stringDate = dateFormat.string(from: Date()).uppercased()

Điều này có thể được nén bằng cách chỉ sử dụng một bộ định dạng ngày với định dạng "EEEE \ nMMMM dd".
LorenzOliveto

Cảm ơn bạn. Tôi không biết cú pháp này. Rất hữu ích! Cảm ơn rât nhiều!
Markus

HƯỚNG DẪN: Tôi đã kiểm tra mã nhưng bạn không nhận được các chữ cái in hoa.
Markus

1
Có, chữ hoa phải được áp dụng cho chuỗi trả về, giống như trong câu trả lời của bạn. Trình định dạng ngày không trả về một chuỗi chữ hoa. Chỉ cần thêm .uppercased () như thế này "dateFormat.string (từ: Date ()) uppercased ()"
LorenzOliveto

2

Để chuyển đổi 2016 / 02-29 12:24:26 thành một ngày, hãy sử dụng công cụ định dạng ngày này:

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd hh:mm:ss"

Chỉnh sửa: Để có được đầu ra ngày 29 tháng 2 năm 2016, hãy sử dụng công cụ định dạng ngày này:

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "MMM dd, yyyy"

Nhưng làm thế nào bạn sẽ chuyển đổi nó thành loại định dạng ngày 29 tháng 2 năm 2016
Sydney Loteria

Bạn có biết tại sao tôi nhận được con số không khi tôi cố in nó không?
Pavlos

2

chỉ cần sử dụng chức năng dưới đây để chuyển đổi định dạng ngày: -

  let convertedFormat =  convertToString(dateString: "2019-02-12 11:23:12", formatIn: "yyyy-MM-dd hh:mm:ss", formatOut: "MMM dd, yyyy")    //calling function

   print(convertedFormat) // feb 12 2019


 func convertToString (dateString: String, formatIn : String, formatOut : String) -> String {

    let dateFormater = DateFormatter()
    dateFormater.timeZone = NSTimeZone(abbreviation: "UTC") as TimeZone!
    dateFormater.dateFormat = formatIn
    let date = dateFormater.date(from: dateString)

    dateFormater.timeZone = NSTimeZone.system

    dateFormater.dateFormat = formatOut
    let timeStr = dateFormater.string(from: date!)
    return timeStr
 }

2
    import UIKit
    // Example iso date time
    let isoDateArray = [
        "2020-03-18T07:32:39.88Z",
        "2020-03-18T07:32:39Z",
        "2020-03-18T07:32:39.8Z",
        "2020-03-18T07:32:39.88Z",
        "2020-03-18T07:32:39.8834Z"
    ]


    let dateFormatterGetWithMs = DateFormatter()
    let dateFormatterGetNoMs = DateFormatter()

// Formater with and without millisecond 
    dateFormatterGetWithMs.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
    dateFormatterGetNoMs.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'"

    let dateFormatterPrint = DateFormatter()
    dateFormatterPrint.dateFormat = "MMM dd,yyyy"

    for dateString in isoDateArray {
        var date: Date? = dateFormatterGetWithMs.date(from: dateString)
        if (date == nil){
            date = dateFormatterGetNoMs.date(from: dateString)
        }
        print("===========>",date!)
    }

Mặc dù mã này có thể trả lời câu hỏi, việc cung cấp ngữ cảnh bổ sung về cách thức và / hoặc lý do giải quyết vấn đề sẽ cải thiện giá trị lâu dài của câu trả lời.
Piotr Labunski

1

Dành cho Swift 4.2, 5

Vượt qua ngày và định dạng như bất cứ cách nào bạn muốn. Để chọn định dạng bạn có thể truy cập, trang web NSDATEFORMATTER :

static func dateFormatter(date: Date,dateFormat:String) -> String {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = dateFormat
    return dateFormatter.string(from: date)
}

0

nhanh 3

func dataFormat(dataJ: Double) -> String {

        let dateFormatter = DateFormatter()
        dateFormatter.dateStyle = .long
        dateFormatter.timeStyle = .none
        let date = Date(timeIntervalSince1970: dataJ)
        return (dataJ != nil) ? "Today, \(dateFormatter.string(from: date))" : "Date Invalid"

    }

0

Đặt nó trong phần mở rộng và gọi nó như dưới đây. Thật dễ dàng để sử dụng trong suốt ứng dụng.

self.getFormattedDate(strDate: "20-March-2019", currentFomat: "dd-MMM-yyyy", expectedFromat: "yyyy-MM-dd")

Thực hiện

func getFormattedDate(strDate: String , currentFomat:String, expectedFromat: String) -> String{
        let dateFormatterGet = DateFormatter()
        dateFormatterGet.dateFormat = currentFomat

        let date : Date = dateFormatterGet.date(from: strDate)!

        dateFormatterGet.dateFormat = expectedFromat
        return dateFormatterGet.string(from: date)
    }

0

Tôi khuyên bạn nên thêm múi giờ theo mặc định. Tôi sẽ đưa ra một ví dụ cho swift 5
1. mới một tệp mở rộngDate+Formatter.swift

import Foundation

extension Date {
    func getFormattedDateString(format: String) -> String {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = format
        dateFormatter.timeZone = TimeZone.current
        return dateFormatter.string(from: self)
    }
}
  1. Ví dụ sử dụng
    let date = Date()
    let dateString = date.getFormattedDateString(format: "yyyy-MM-dd HH:mm:ss")
    print("dateString > \(dateString)")
    // print
    // dateString > 2020-04-30 15:15:21
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.