Swift'te Tarih Biçimi


150

Bu tarih saatini tarihten nasıl değiştireceğim?

İtibaren: 2016-02-29 12:24:26
için: 29 Şub 2016

Şimdiye kadar, bu benim kodum ve nil değeri döndürür:

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)

Yanıtlar:


267

NSDateFormattersİlk önce dizgiyi a dönüştüren 2 NSDateve ikincisini tarih biçiminde yazdırmak için 2 farklı bildirmeniz gerekir.
Bu kodu deneyin:

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 ve üstü:

Swift itibaren 3 NSDatesınıf olarak değiştirildi Dateve NSDateFormatterhiç 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
DateFormatterGet dateFormat öğesinin biri milisaniye, diğeri milisaniye içermeyen 2 farklı biçimi kabul etmesi gerekiyorsa ne olur? yani yyyy-AA-gg'T'HH: mm: ssZZZZZ ve yyyy-AA-gg'T'HH: aa: ss: SSSZZZZZ
KvnH

1
Tarihi almak için iki farklı DateFormatter bildirmeniz gerektiğini düşünüyorum: Birincisi başarısız olursa (sıfır döndürecek), ikincisini kullanın.
LorenzOliveto

Lütfen bana yardım edebilir misin, "Sal Mar 12 2019 12:00:00 GMT-0500 (CDT)" için tarih formatı ne olacak
Devesh

@Devesh böyle bir şey olmalı "EEE MMM g yyyy SS: dd: ss ZZZZ", nsdateformatter.com göz atın desteklenen tüm biçimleri ile çok hanful bir site
LorenzOliveto

@lorenzoliveto evet Ben nsdateformatter.com üzerinde de denedim bu biçim için tüm yol denedim, yine de, "Sal Mar 12 2019 12:00:00 GMT-0500 (CDT)" bu biçim için hiçbir şey alamıyorum. Bir JSON bu biçimi alıyorum. Bunun geçerli bir dize olup olmadığından emin değilim, lütfen bana yardımcı olabilir misiniz?
Devesh

213

Bu, dateformater.dateformat kullanmak isteyenler için yararlı olabilir; eğer 12.09.18kullanmak istiyorsandateformater.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
Cevabınız çok aydınlatıcı ve sorunumu çözdü. Teşekkür ederim.
andrewcar

50

Swift 3 ve üstü

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

Bu, Uygulamanızı yerelleştirmek istediğinizde de yararlıdır. Yerel Ayar (tanımlayıcı :) ISO 639-1 Kodunu kullanır . Ayrıca bkz. Apple Belgeleri


8
Uygulamanızı yerelleştirmek istiyorsanız Locale.current, kullanıcının yerel ayarını kullanın.
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 Dönüştür Şub 01,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

DateBunun yerine yeni nesneyle Swift 3 sürümü 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: mitul-nakum önerisi sonrası


2
dateFormatterGet.dateFormat = "yyyy-AA-gg SS: dd: ss" saat formatı, saat 24
formatta

22

hızlı 3

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

16

yyyy-MM-dd'T'HH:mm:ss.SSS'Z'Sorunumu şu biçime (örneğin 2018-06-15T00: 00: 00.000Z) çözdüm:

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

DateUzantılı Swift 3

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

Sonra şöyle kullanabilirsiniz:

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

8

Swift 4, 4.2 ve 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
Bu sadece bir tane ile iyi, kısa bir çözümdür DateFormatter()! Dikkat edilmesi gereken bir şey: DateFormatterAyrıca uygulama şemasını (şemada ayarlanmıştır) dikkate alır! Örneğin 2019-05-27 11:03:03 +0000format ile yyyy-MM-dd HH:mm:ssve "Almanya" olarak bölge dönüşüyor 2019-05-27 13:03:03. Bu fark DST'den kaynaklanır: Yaz aylarında Almanya GMT + 2, kışın GMT + 1'dir.
Nefret

4

"1996-12-19T16: 39: 57-08: 00" tarihinden ayrıştırmak istiyorsanız, aşağıdaki "yyyy-MM-dd'T'HH: mm: ssZZZZZ" biçimini kullanın:

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)

Apple'dan https://developer.apple.com/documentation/foundation/dateformatter


3

Biçim tarihinin başka bir ilginç olasılığı. Bu ekran görüntüsü Apple'ın App "News" 'e aittir.

Uygulama ekran görüntüsü

İşte kod:

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)

Lorzoliveto tarafından önerilen alternatif eklemek için bir şey yok. Sadece mükemmel.

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

Bu, "EEEE \ nMMMM dd" biçimine sahip yalnızca bir tarih biçimlendirici kullanılarak sıkıştırılabilir.
LorenzOliveto

Teşekkür ederim. Bu sözdizimini bilmiyordum. Çok kullanışlı! Çok teşekkür ederim!
Markus

DÜZELTME: Kodu test ettim ancak harfleri büyük harfle almıyorsunuz.
Markus

1
Evet, yanıtınızdaki gibi döndürülen dizeye büyük harf uygulanmalıdır. Tarih biçimlendiricisi büyük harfli bir dize döndürmez. Bunun gibi .uppercased () gibi bir "dateFormat.string (from: Date ()).
Uppercased

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

Bu kod soruyu cevaplayabilse de, sorunun nasıl ve / veya neden çözüldüğü hakkında ek bağlam sağlamak yanıtlayıcının uzun vadeli değerini artıracaktır.
Piotr Labunski

2

2016-02-29 12:24:26'yı bir tarihe dönüştürmek için bu tarih biçimlendiricisini kullanın:

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

Düzenleme: Çıktıyı almak için 29 Şub 2016 bu tarih biçimlendiricisini kullanın:

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

Ama bunu bu tür bir tarih biçimine nasıl dönüştüreceksiniz 29 Şub 2016
Sydney Loteria

Bunu yazdırmaya çalıştığımda neden nil aldığımı biliyor musun?
Pavlos

2

tarih biçimini dönüştürmek için sadece aşağıdaki işlevi kullanın: -

  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
 }

1

Swift 4.2, 5 için

Tarihi ve biçimi istediğiniz şekilde iletin. NSDATEFORMATTER web sitesini ziyaret edebileceğiniz biçimi seçmek için :

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

0

hızlı 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

Uzantına yerleştirin ve aşağıdaki gibi arayın. Uygulama boyunca kullanımı kolaydır.

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

uygulama

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

Varsayılan olarak saat dilimi eklemenizi öneririm. Hızlı 5 için bir örnek göstereceğim
1. yeni bir uzantı dosyasıDate+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. Kullanım örneği
    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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.