Формат даты в Swift


166

Как мне преобразовать это datetime из даты?

От этого: 2016-02-29 12:24:26
по: 29 февраля 2016 г.

Пока что это мой код, который возвращает нулевое значение:

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)

Ответы:


291

Вы должны объявить 2 разных NSDateFormatters: первый для преобразования строки в a, NSDateа второй для печати даты в вашем формате.
Попробуйте этот код:

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 и выше:

Из Swift 3 NSDateкласс изменен на Dateи NSDateFormatterна 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 должен принимать 2 разных формата: один содержит миллисекунды, а другой - без миллисекунд? т.е. гггг-ММ-дд'Т'ЧЧ: мм: ссЗЗЗЗЗ и гггг-ММ-дд'Т'ЧЧ: мм: сс: SSSZZZZZ
KvnH

1
Я думаю, вам нужно объявить два разных DateFormatter, чтобы получить дату: если первый не работает (он вернет nil), используйте второй.
LorenzOliveto

Не могли бы вы помочь мне, какой будет формат даты для "Вт, 12 марта 2019 12:00:00 GMT-0500 (CDT)"
Девеш

@Devesh это должно быть что-то вроде этого: "EEE MMM d yyyy HH: mm: ss ZZZZ", проверьте nsdateformatter.com , это очень неприятный сайт со всеми поддерживаемыми форматами
LorenzOliveto

@lorenzoliveto да, я все время пробовал использовать этот формат. Я тоже пробовал на nsdateformatter.com, но я не могу ничего получить для этого формата "Tue Mar 12 2019 12:00:00 GMT-0500 (CDT)". Я получаю этот формат в формате JSON. Я не уверен, что это верная строка, не могли бы вы мне помочь.
Девеш

252

Это может быть полезно для тех, кто хочет использовать dateformater.dateformat; если вы хотите, чтобы 12.09.18вы использовалиdateformater.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

4
Ваш ответ был настолько информативным и помог решить мою проблему. Спасибо.
andrewcar

Лучший ответ на свете. Спасибо!
Филлип Джейкобс,

Благодарность! Ваш ответ очень полезен для меня ...
Silversky Technology

51

Swift 3 и выше

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

Это также полезно, если вы хотите локализовать свое приложение. Локаль (идентификатор:) использует код ISO 639-1 . См. Также документацию Apple


8
Если вы хотите локализовать свое приложение, просто используйте, Locale.currentчтобы использовать языковой стандарт пользователя.
Виктор Энгель

50

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 Конвертировать 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

Версия Swift 3 с новым Dateобъектом 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 предложение


2
dateFormatterGet.dateFormat = "yyyy-MM-dd HH: mm: ss" для форматирования часов потребуется заглавная
буква

22

быстрый 3

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

18

Я решил свою проблему в формате yyyy-MM-dd'T'HH:mm:ss.SSS'Z'(например, 2018-06-15T00: 00: 00.000Z) следующим образом:

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

1
Спасибо! Полезно для меня!
Кайо Сантос,

10

Swift 3 с Dateрасширением

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

Тогда вы можете использовать это так:

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

9

Swift 4, 4.2 и 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
Это хорошее, короткое решение всего с одним DateFormatter()! Что следует знать: DateFormatterтакже учитывается регион приложения (установленный в схеме)! Например, 2019-05-27 11:03:03 +0000с форматом yyyy-MM-dd HH:mm:ssи "Германией" как регион превращается 2019-05-27 13:03:03. Эта разница вызвана DST: летом в Германии GMT + 2, а зимой - по GMT + 1.
Неф

4

Если вы хотите проанализировать дату из «1996-12-19T16: 39: 57-08: 00», используйте следующий формат «гггг-ММ-дд'T'HH: мм: ссЗЗЗЗЗ»:

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 https://developer.apple.com/documentation/foundation/dateformatter


3

Еще одна интересная возможность форматирования даты. Этот снимок экрана принадлежит приложению Apple «Новости».

Скриншот приложения

Вот код:

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)

К альтернативе, предложенной лоренцоливето, добавить нечего. Это просто идеально.

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

Его можно сжать с помощью только одного средства форматирования даты в формате «EEEE \ nMMMM dd».
LorenzOliveto

Спасибо. Я не знал этого синтаксиса. Очень полезно! Большое спасибо!
Маркус

ИСПРАВЛЕНИЕ: Я проверил код, но вы не получаете буквы в верхнем регистре.
Маркус

1
Да, к возвращаемой строке нужно применять прописные буквы, как в вашем ответе. Средство форматирования даты не возвращает строку в верхнем регистре. Просто добавьте .uppercased (), например, "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!)
    }

Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, как и / или почему он решает проблему, улучшит долгосрочную ценность ответа.
Петр Лабунский,

2

Чтобы преобразовать 2016-02-29 12:24:26 в дату, используйте это средство форматирования даты:

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

Изменить: чтобы получить результат 29 февраля 2016 г., используйте этот форматер даты:

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

Но как преобразовать это в такой формат даты 29 февраля 2016 г.
Сидней Лотерия

ты знаешь, почему я получаю ноль, когда пытаюсь это напечатать?
Павлос

2

просто используйте функцию ниже для преобразования формата даты: -

  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

Поместите его в расширение и назовите, как показано ниже. Его легко использовать во всем приложении.

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

Реализация

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

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

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

0

быстрый 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

Я рекомендую добавить часовой пояс по умолчанию. Я покажу пример для swift 5
1. новый файл расширения.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. Пример использования
    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

0

Конвертируйте ответ @BatyrCan в Swift 5.3 с дополнительными форматами. Протестировано в Xcode 12.

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "HH:mm:ss"
var dateFromStr = dateFormatter.date(from: "12:16:45")!

dateFormatter.dateFormat = "hh:mm:ss a 'on' MMMM dd, yyyy"
//Output: 12:16:45 PM on January 01, 2000

dateFormatter.dateFormat = "E, d MMM yyyy HH:mm:ss Z"
//Output: Sat, 1 Jan 2000 12:16:45 +0600

dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
//Output: 2000-01-01T12:16:45+0600

dateFormatter.dateFormat = "EEEE, MMM d, yyyy"
//Output: Saturday, Jan 1, 2000

dateFormatter.dateFormat = "MM-dd-yyyy HH:mm"
//Output: 01-01-2000 12:16

dateFormatter.dateFormat = "MMM d, h:mm a"
//Output: Jan 1, 12:16 PM

dateFormatter.dateFormat = "HH:mm:ss.SSS"
//Output: 12:16:45.000

dateFormatter.dateFormat = "MMM d, yyyy"
//Output: Jan 1, 2000

dateFormatter.dateFormat = "MM/dd/yyyy"
//Output: 01/01/2000

dateFormatter.dateFormat = "hh:mm:ss a"
//Output: 12:16:45 PM

dateFormatter.dateFormat = "MMMM yyyy"
//Output: January 2000

dateFormatter.dateFormat = "dd.MM.yy"
//Output: 01.01.00

//Customisable AP/PM symbols
dateFormatter.amSymbol = "am"
dateFormatter.pmSymbol = "Pm"
dateFormatter.dateFormat = "a"
//Output: Pm

// Usage
var timeFromDate = dateFormatter.string(from: dateFromStr)
print(timeFromDate)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.