Format Tanggal dalam Swift

150

Bagaimana saya akan mengkonversi datetime ini dari tanggal?

Dari ini: 2016-02-29 12:24:26
hingga: 29 Feb 2016

Sejauh ini, ini adalah kode saya dan mengembalikan nilai nol:

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)
Sydney Loteria
sumber

Jawaban:

267

Anda harus mendeklarasikan 2 berbeda NSDateFormatters, yang pertama untuk mengubah string menjadi NSDatedan yang kedua untuk mencetak tanggal dalam format Anda.
Coba kode ini:

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 dan lebih tinggi:

Dari Swift 3 NSDatekelas telah diubah ke Datedan NSDateFormatterke 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")
}
LorenzOliveto
sumber
1
Apa yang terjadi jika dateFormatterDapatkan dateFormat perlu menerima 2 format berbeda - satu berisi milidetik dan satu tanpa milidetik? yaitu yyyy-MM-dd'T'HH: mm: ssZZZZZ dan yyyy-MM-dd'T'HH: mm: ss: SSSZZZZZ
KvnH
1
Saya pikir Anda harus mendeklarasikan dua DateFormatters berbeda untuk mendapatkan tanggal: jika yang pertama gagal (itu akan mengembalikan nihil), gunakan yang kedua.
LorenzOliveto
Bisakah Anda membantu saya, apa format tanggal untuk "Sel 12 Maret 2019 12:00:00 GMT-0500 (CDT)"
Devesh
@Devesh semestinya seperti ini "EEE MMM d yyyy HH: mm: ss ZZZZ", lihat nsdateformatter.com ini situs yang sangat mewah dengan semua format yang didukung
LorenzOliveto
@lorenzoliveto ya saya telah mencoba semua cara untuk format ini, saya mencoba di nsdateformatter.com juga, masih, saya tidak bisa mendapatkan apa pun untuk "Sel 12 Maret 2019 12:00:00 GMT-0500 (CDT)" format ini. Saya mendapatkan format ini dalam JSON. Saya tidak yakin apakah ini string yang valid, bisakah Anda membantu saya.
Devesh
211

Ini mungkin berguna bagi yang ingin menggunakan dateformater.dateformat; jika Anda ingin 12.09.18Anda gunakandateformater.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
BatyrCan
sumber
2
Jawaban Anda sangat menerangi dan memperbaiki masalah saya. Terima kasih.
andrewcar
50

Swift 3 dan lebih tinggi

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

Ini juga membantu ketika Anda ingin melokalisasi Aplikasi Anda. Lokal (pengidentifikasi :) menggunakan Kode ISO 639-1 . Lihat juga Dokumentasi Apple

Jonas Deichelmann
sumber
8
Jika Anda ingin melokalisasi aplikasi Anda, cukup gunakan Locale.currentuntuk menggunakan lokal pengguna.
Victor Engel
46

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 Konversi 01 Feb 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!);
    }
}
Vishal Vaghasiya
sumber
36

Versi Swift 3 dengan Dateobjek baru sebagai gantinya 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: setelah saran mitul-nakum

ciccioska
sumber
2
dateFormatterGet.dateFormat = "yyyy-MM-dd HH: mm: ss" format jam akan membutuhkan modal HH, karena jam dalam 24 format
Mitul Nakum
22

cepat 3

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

Saya memecahkan masalah saya ke format yyyy-MM-dd'T'HH:mm:ss.SSS'Z'(misalnya 2018-06-15T00: 00: 00.000Z) dengan ini:

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!)
}
Polo Ângelo
sumber
9

Swift 3 dengan Dateekstensi

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

Maka Anda dapat menggunakannya seperti ini:

let date = Date()
date.string(with: "MMM dd, yyyy")
Jonathan Cravotta
sumber
8

Swift 4, 4.2 dan 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)
Akbar Khan
sumber
1
Ini adalah solusi singkat yang bagus hanya dengan satu DateFormatter()! Sesuatu yang harus diperhatikan: Ini DateFormatterjuga memperhitungkan wilayah aplikasi (diatur dalam skema)! Misalnya2019-05-27 11:03:03 +0000 dengan format yyyy-MM-dd HH:mm:ssdan "Jerman" sebagai wilayah berubah menjadi 2019-05-27 13:03:03. Perbedaan ini disebabkan oleh DST: Di musim panas Jerman adalah GMT + 2, sedangkan di musim dingin GMT + 1.
Neph
4

Jika Anda ingin menguraikan tanggal dari "1996-12-19T16: 39: 57-08: 00", gunakan format berikut "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)

dari Apple https://developer.apple.com/documentation/foundation/dateformatter

Amit Tyagi
sumber
3

Kemungkinan interessant lain dari format tanggal. Tangkapan layar ini milik App Apple "News".

Tangkapan layar aplikasi

Ini kodenya:

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)

Tidak ada yang ditambahkan ke alternatif yang diusulkan oleh lorenzoliveto. Sempurna.

let dateFormat = DateFormatter()
dateFormat.dateFormat = "EEEE\nMMMM dd"
let stringDate = dateFormat.string(from: Date()).uppercased()
Markus
sumber
Ini dapat dipadatkan menggunakan hanya satu formatter tanggal dengan format "EEEE \ nMMMM dd".
LorenzOliveto
Terima kasih. Saya tidak tahu sintaks ini. Sangat berguna! Terima kasih banyak!
Markus
RECTIFICATION: Saya telah menguji kode tetapi Anda tidak mendapatkan huruf dalam huruf besar.
Markus
1
Ya, huruf besar harus diterapkan ke string yang dikembalikan, seperti dalam jawaban Anda. Pemformat tanggal tidak mengembalikan string huruf besar. Cukup tambahkan .uppercased () seperti ini "dateFormat.string (dari: Date ()). Uppercased ()"
LorenzOliveto
3
    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!)
    }
Rajdeo Das
sumber
Sementara kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang bagaimana dan / atau mengapa memecahkan masalah akan meningkatkan nilai jangka panjang jawaban.
Piotr Labunski
2

Untuk mengubah 2016-02-29 12:24:26 menjadi tanggal, gunakan formatter tanggal ini:

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

Sunting: Untuk mendapatkan output 29 Feb 2016 gunakan formatter tanggal ini:

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "MMM dd, yyyy"
dasdom
sumber
Tapi bagaimana Anda mengonversi itu ke format tanggal seperti ini 29 Feb 2016
Sydney Loteria
apakah Anda tahu mengapa saya mendapatkan nol saat mencoba mencetak ini?
Pavlos
2

cukup gunakan fungsi di bawah ini untuk mengonversi format tanggal: -

  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
 }
Pankaj Jangid
sumber
1

Untuk Swift 4.2, 5

Berikan tanggal dan format sesuai keinginan Anda. Untuk memilih format yang dapat Anda kunjungi, situs web NSDATEFORMATTER :

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

cepat 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"

    }
M.zar
sumber
0

Tempatkan di ekstensi dan panggil seperti di bawah ini. Sangat mudah digunakan di seluruh aplikasi.

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

Penerapan

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)
    }
Sunil aruru
sumber
0

Saya sarankan untuk menambahkan zona waktu secara default. Saya akan menunjukkan contoh untuk swift 5
1. baru file ekstensiDate+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. Contoh penggunaan
    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
Zgpeace
sumber