Как я могу преобразовать строковую дату в NSDate?

183

Я хочу преобразовать "2014-07-15 06: 55: 14.198000 + 00: 00" эту строковую дату в NSDate в Swift.

  • 0
    Похоже, что ваша строка «2014-07-15 06: 55: 14.198000 + 00: 00» недоступна, если вы используете NSDateFormatter
  • 0
    userguide.icu-project.org/formatparse/datetime мне очень помог
Показать ещё 3 комментария
Теги:
string
nsdate

17 ответов

317
Лучший ответ

попробуй это:

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = /* find out and place date format from 
                            * http://userguide.icu-project.org/formatparse/datetime
                            */
let date = dateFormatter.dateFromString(/* your_date_string */)

Для дальнейшего запроса проверьте классы NSDateFormatter и DateFormatter платформы Foundation для Objective-C и Swift, соответственно.

Swift 3 и более поздние версии (включая Swift 4)

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = /* date_format_you_want_in_string from
                            * http://userguide.icu-project.org/formatparse/datetime
                            */
guard let date = dateFormatter.date(from: /* your_date_string */) else {
   fatalError("ERROR: Date conversion failed due to mismatched format.")
}

// use date constant here
  • 11
    Нашел решение, просто нужно установить "гггг-мм-дд чч: мм: сс.SSSSxxx" в этом формате даты
  • 1
    У меня есть строка с датой, подобной этой, "2014-07-15 06: 55: 14-0400", и я попытался использовать yyyy-MM-dd hh:mm:ssZZZ . Но я не могу получить объект даты из строки.
Показать ещё 10 комментариев
73

Swift 4

import Foundation

let dateString = "2014-07-15" // change to your date format

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

let date = dateFormatter.date(from: dateString)
println(date)

Свифт 3

import Foundation

var dateString = "2014-07-15" // change to your date format

var dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"

var date = dateFormatter.dateFromString(dateString)
println(date)

Я могу сделать это с помощью этого кода.

  • 5
    Код не правильный. Он выводит некоторые "15 января 2014 года, 12:00 утра"
  • 5
    использование dd вместо DD должно помочь решить проблему «всегда январь».
Показать ещё 3 комментария
52
 func convertDateFormatter(date: String) -> String
 {

    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"//this your string date format
    dateFormatter.timeZone = NSTimeZone(name: "UTC")
    let date = dateFormatter.dateFromString(date)


    dateFormatter.dateFormat = "yyyy MMM EEEE HH:mm"///this is what you want to convert format
    dateFormatter.timeZone = NSTimeZone(name: "UTC")
    let timeStamp = dateFormatter.stringFromDate(date!)


    return timeStamp
}

Обновлен для Swift 3.

func convertDateFormatter(date: String) -> String
{

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"//this your string date format
    dateFormatter.timeZone = NSTimeZone(name: "UTC") as TimeZone!
    let date = dateFormatter.date(from: date)


    dateFormatter.dateFormat = "yyyy MMM EEEE HH:mm"///this is what you want to convert format
    dateFormatter.timeZone = NSTimeZone(name: "UTC") as TimeZone!
    let timeStamp = dateFormatter.string(from: date!)


    return timeStamp
}
15

Если вам понадобится часто разбирать строку в дату, вам может понадобиться переместить функциональность в расширение. Я создал файл sharedCode.swift и разместил там свои расширения:

extension String
{   
    func toDateTime() -> NSDate
    {
        //Create Date Formatter
        let dateFormatter = NSDateFormatter()

        //Specify Format of String to Parse
        dateFormatter.dateFormat = "yyyy-MM-dd hh:mm:ss.SSSSxxx"

        //Parse into NSDate
        let dateFromString : NSDate = dateFormatter.dateFromString(self)!

        //Return Parsed Date
        return dateFromString
    }
}

Затем, если вы хотите преобразовать свою строку в NSDate, вы можете просто написать что-то вроде:

var myDate = myDateString.toDateTime()
  • 1
    Благодарю. Также возможно, хотя и менее полезно, написать: var myDate = "04-05-2015" .toDateTime () Я нашел это удобным при настройке тестовых данных.
  • 1
    Я почти уверен, что hh должно быть HH в этом случае.
Показать ещё 1 комментарий
14

подробности

Swift 4, xCode 9.2/Swift 3, xCode 8.2.1

Расширения формата даты

import Foundation

extension DateFormatter {

    convenience init (format: String) {
        self.init()
        dateFormat = format
        locale = Locale.current
    }
}

extension String {

    func toDate (format: String) -> Date? {
        return DateFormatter(format: format).date(from: self)
    }

    func toDateString (inputFormat: String, outputFormat:String) -> String? {
        if let date = toDate(format: inputFormat) {
             return DateFormatter(format: outputFormat).string(from: date)
        }
        return nil
    }
}

extension Date {

    func toString (format:String) -> String? {
        return DateFormatter(format: format).string(from: self)
    }
}

использование

var dateString = "14.01.2017T14:54:00"
let format = "dd.MM.yyyy'T'HH:mm:ss"
let date = Date()

print("original String with date:               \(dateString)")
print("date String() to Date():                 \(dateString.toDate(format: format)!)")
print("date String() to formated date String(): \(dateString.toDateString(inputFormat: format, outputFormat: "dd MMMM")!)")
print("format Date():                           \(date.toString(format: "dd MMM HH:mm")!)")

Результат

Изображение 1783

Дополнительная информация

О формате даты

9

Для Swift 3

func stringToDate(_ str: String)->Date{
    let formatter = DateFormatter()
    formatter.dateFormat="yyyy-MM-dd hh:mm:ss Z"
    return formatter.date(from: str)!
}
func dateToString(_ str: Date)->String{
    var dateFormatter = DateFormatter()
    dateFormatter.timeStyle=DateFormatter.Style.short
    return dateFormatter.string(from: str)
}
5

Фрагменты кода на этой странице QA "перевернуты"...

Первое, что Apple упоминает, это то, что вы кешируете свой форматтер...

Ссылка на Apple doco с указанием, как это сделать:

Форматирование кеша для эффективностиСоздание форматирования даты не является дешевой операцией.... кешировать один экземпляр...

Использовать глобальный...

let df : DateFormatter = {
    let formatter = DateFormatter()
    formatter.dateFormat = "yyyy-MM-dd"
    return formatter 
}()

Затем просто используйте этот форматтер где-нибудь...

let s = df.string(from: someDate)

или

let d = df.date(from: someString)

Или используйте любой другой, много удобных методов в DateFormatter.

Это так просто.

(Если вы пишете расширение на String, ваш код полностью "перевернут" - вы не можете использовать любые вызовы dateFormatter!)

Обратите внимание, что обычно у вас будет несколько таких глобальных комбинаций, таких как "formatForClient" "formatForPubNub" "formatForDisplayOnInvoiceScreen" и т.д.

  • 0
    Не нужно оставлять их в глобальном масштабе. Вы можете расширить Formatter, просто объявив ваши свойства статическими. проверьте это stackoverflow.com/a/43658213/2303865
4

Swift 3,4:

2 полезных преобразования:

string(from: Date) // to convert from Date to a String
date(from: String) // to convert from String to Date

Использование: 1.

let date = Date() //gives today date
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd.MM.yyyy"
let todaysDateInUKFormat = dateFormatter.string(from: date)

2.

 let someDateInString = "23.06.2017"
 var getDateFromString = dateFormatter.date(from: someDateInString)
4

Начиная с Swift 3, многие префиксы NS были отброшены.

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ" 
/* date format string rules
 * http://userguide.icu-project.org/formatparse/datetime
 */

let date = dateFormatter.date(from: dateString)
  • 0
    У меня есть проблема: моя дата в виде строки выглядит так: «2017-03-10 22:16:00 +0000», и я использовал этот формат: «гггг-ММ-дд чч: мм: сс Z» и этот: "YYYY-MM-dd'T'HH: мм: сс". Но для обоих случаев, когда я делаю это: let beginDate = df.date(from: beginDateString) , я получаю ноль! Зачем? ( df = DateFormatter() )
4

Быстрые расширения поддержки, с расширением вы можете добавить новую функциональность к существующим типам class, structure, enumeration или protocol.

Вы можете добавить новую функцию init в объект NSDate, убрав объект с помощью ключевого слова extension.

extension NSDate
{
    convenience
    init(dateString:String) {
        let dateStringFormatter = NSDateFormatter()
        dateStringFormatter.dateFormat = "yyyyMMdd"
        dateStringFormatter.locale = NSLocale(localeIdentifier: "fr_CH_POSIX")
        let d = dateStringFormatter.dateFromString(dateString)!
        self.init(timeInterval:0, sinceDate:d)
    }
} 

Теперь вы можете запустить объект NSDate, используя:

let myDateObject = NSDate(dateString:"2010-12-15 06:00:00")
  • 0
    Мне нравится способ инициации. Нет ли другого способа создать дату без использования timeInterval? Что делать, если nsdate перестает иметь инициализатор с параметром даты? как бы вы решили это? Лично я предпочитаю путь инициализации, но я не знаю, как преодолеть эту проблему
  • 0
    У меня есть проблема: моя дата в виде строки выглядит так: «2017-03-10 22:16:00 +0000», и я использовал этот формат: «гггг-ММ-дд чч: мм: сс Z» и этот: "YYYY-MM-dd'T'HH: мм: сс". Но для обоих случаев, когда я делаю это: let beginDate = df.date(from: beginDateString) , я получаю ноль! Зачем? ( df = DateFormatter() )
3

ДЛЯ SWIFT 3.1

func convertDateStringToDate(longDate: String) -> String{

    /* INPUT: longDate = "2017-01-27T05:00:00.000Z"
     * OUTPUT: "1/26/17"
     * date_format_you_want_in_string from
     * http://userguide.icu-project.org/formatparse/datetime
     */

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

    if date != nil {

        let formatter = DateFormatter()
        formatter.dateStyle = .short
        let dateShort = formatter.string(from: date!)

        return dateShort

    } else {

        return longDate

    }
}

ПРИМЕЧАНИЕ: ЭТО ВОЗВРАЩАЕТ ОРИГИНАЛЬНУЮ СТРИНУЮ, ЧТО ОШИБКА

2

Эта работа для меня..

    import Foundation
    import UIKit

    //dateString = "01/07/2017"
    private func parseDate(_ dateStr: String) -> String {
            let simpleDateFormat = DateFormatter()
            simpleDateFormat.dateFormat = "dd/MM/yyyy" //format our date String
            let dateFormat = DateFormatter()
            dateFormat.dateFormat = "dd 'de' MMMM 'de' yyyy" //format return

            let date = simpleDateFormat.date(from: dateStr)
            return dateFormat.string(from: date!)
    }
2

Чтобы добавить String в формат даты в Swift, я сделал это

 var dataFormatter:NSDateFormatter = NSDateFormatter()
                dataFormatter.dateFormat = "dd-MMMM 'at' HH:mm a"

cell.timeStamplbl.text = dataFormatter.stringFromDate(object.createdAt)
0

Вы можете попробовать этот быстрый код

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "dd/MM/yyyy"//same as strDate date formator
    dateFormatter.timeZone = TimeZone(abbreviation: "GMT+0:00")//Must used if you get one day less in conversion
    let convertedDateObject = dateFormatter.date(from: strDate)
0

Ниже приведены некоторые варианты преобразования формата строки в дату в быстрой iOS.

  1. Thursday, Dec 27, 2018 формат Thursday, Dec 27, 2018= EEEE, MMM d, yyyy
  2. 12/27/2018 формат = MM/dd/yyyy 12/27/2018 MM/dd/yyyy
  3. 12-27-2018 09:59 формат = MM-dd-yyyy HH:mm
  4. Dec 27, 9:59 AM формат Dec 27, 9:59 AM= MMM d, h:mm a
  5. December 2018 формат = MMMM yyyy
  6. Dec 27, 2018 формат Dec 27, 2018= MMM d, yyyy
  7. Thu, 27 Dec 2018 09:59:19 +0000 формат = E, d MMM yyyy HH:mm:ss Z
  8. 2018-12-27T09:59:19+0000 формат = yyyy-MM-dd'T'HH:mm:ssZ
  9. 27.12.18 формат = dd.MM.yy
  10. 09:59:19.815 формат = HH:mm:ss.SSS
0
Swift: iOS
if we have string, convert it to NSDate,

var dataString = profileValue["dob"] as String
var dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "MM-dd-yyyy"

// convert string into date
let dateValue:NSDate? = dateFormatter.dateFromString(dataString)

if you have and date picker parse date like this

// to avoid any nil value
if let isDate = dateValue {
self.datePicker.date = isDate
}
-3
import Foundation

let now : String = "2014-07-16 03:03:34 PDT"
var date : NSDate
var dateFormatter : NSDateFormatter

date = dateFormatter.dateFromString(now)

date // $R6: __NSDate = 2014-07-16 03:03:34 PDT

https://developer.apple.com/library/prerelease/mac/documentation/Cocoa/Reference/Foundation/Classes/NSDateFormatter_Class/index.html#//apple_ref/doc/uid/20000447-SW32

  • 2
    Как это должно работать? Форматер даты не инициализируется, и также нет причин разделять объявление и инициализацию даты.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню