Làm cách nào tôi có thể chuyển đổi ngày chuỗi thành NSDate?


195

Tôi muốn chuyển đổi "2014-07-15 06: 55: 14.198000 + 00: 00" chuỗi ngày này thành NSDate trong Swift.


Có vẻ như chuỗi của bạn "2014-07-15 06: 55: 14.198000 + 00: 00" không thể truy cập được nếu bạn sử dụng NSDateFormatter
Alex Peda


Là tài nguyên đồng hành với tất cả các câu trả lời dưới đây, tôi đặc biệt khuyên bạn nên kiểm tra nsdateformatter.com
user3344977

Các câu trả lời cũ ở đây thực sự SAI . Tài liệu Apple nói rõ ràng bạn cần lưu bộ định dạng. stackoverflow.com/a/42370648/294884
Fattie

Nếu bạn cần bất kỳ người trợ giúp nào có định dạng, nsdateformatter.com
Pedro Luz

Câu trả lời:


341

thử cái này:

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 */)

Để biết thêm truy vấn, hãy kiểm tra các lớp NSDateFormatterDateFormatter của khung Foundation cho Objective-C và Swift, tương ứng.

Swift 3 trở lên (bao gồm 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
Tìm thấy giải pháp chỉ cần đặt "yyyy-MM-dd hh: mm: ss.SSSSxxx" định dạng ngày này
Shardul

1
Tôi có một chuỗi ngày như thế này "2014-07-15 06: 55: 14-0400" và tôi đã thử sử dụng yyyy-MM-dd hh:mm:ssZZZ. Nhưng tôi không thể lấy đối tượng ngày ra khỏi chuỗi.
iamprem

2
@Prem, nếu bạn thấy đầu ra là "2014-07-15 10:55:14 +0000"chính xác. Theo NSDatemô tả, đầu ra của ngày sẽ được tính với chênh lệch (ở đây, GMT -4 giờ). Nếu bạn muốn có sự khác biệt giữa GMT và UTC, -0400hãy kiểm tra tham chiếu
x4h1d

@ x4h1d, Này, tôi đã hiểu rồi! Tôi đã phạm một sai lầm trong hhđó nên được HH. Cảm ơn!
iamprem

3
@ lmiguelvargasf, tôi nghĩ rằng nó sẽ được yyyy-MM-dd'T'HH:mm:ss.SSS'Z'. Tôi giả sử Zchỉ là một nhân vật ở đây. Hãy nhớ rằng, Zcó một ý nghĩa đặc biệt quá. Nếu bạn muốn Zchỉ định như basic hmsđịnh dạng sẽ được yyyy-MM-dd'T'HH:mm:ss.SSSZ.
x4h1d

71

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)

Swift 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)

Tôi có thể làm điều đó với mã này.


5
Mã không đúng. Nó xuất ra một số "ngày 15 tháng 1 năm 2014, 12:00 sáng"
Jake Lin

5
sử dụng ddthay vì DDsẽ giúp khắc phục vấn đề "luôn luôn là tháng một".
Pascal Belloncle

1
Phiên bản chính xác là, yyyy-MM-ddnếu không, ngày được phân tích cú pháp bị kẹt vào tháng 1 - Tôi đã cập nhật câu trả lời để phản ánh sự thay đổi.
Zorayr

Điều gì xảy ra nếu tôi muốn vượt qua ngày hiện tại dưới dạng chuỗi. Điều này sẽ làm việc?
Arjun Kalidas

@Zorayr, Kittisak: Tôi đang nhận được đặt ra, Tùy chọn (2014/07/14 18:30:00 +0000) có nghĩa là, một ngày được giảm. Làm thế nào tôi có thể sửa lỗi này ?
Vineesh TP

54
 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
}

Cập nhật cho 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
}

17

Chi tiết

  • Swift 4, Xcode 9.2
  • Swift 5, Xcode 10.2 (10E125)

Giải pháp

import Foundation

extension DateFormatter {

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

extension String {

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

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

extension Date {

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

Sử dụng

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

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

Kết quả

nhập mô tả hình ảnh ở đây

Thêm thông tin

Giới thiệu về định dạng ngày


15

Nếu bạn thường xuyên cần phân tích chuỗi thành một ngày, bạn có thể muốn chuyển chức năng thành một tiện ích mở rộng. Tôi đã tạo một tệp sharedCode.swift và đặt các tiện ích mở rộng của mình ở đó:

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

Sau đó, nếu bạn muốn chuyển đổi chuỗi của mình thành NSDate, bạn có thể viết một cái gì đó như:

var myDate = myDateString.toDateTime()

1
Cảm ơn. Mặc dù cũng ít hữu ích hơn khi viết: var myDate = "04-05-2015" .toDateTime () Tôi thấy tiện dụng này khi thiết lập dữ liệu thử nghiệm.
Stephen Watson

1
Tôi khá chắc chắn rằng hhnên có HHtrong trường hợp này.
Alex

Điều này không cung cấp cho tôi ở định dạng tôi chỉ định: var date = NSDate (); hãy để dateFormatter = NSDateFormatter (); dateFormatter.dateFormat = "MMMM d, YYYY"; hãy để myDate = dateFormatter.opesFromDate (ngày); Và trên hết, nếu tôi sử dụng tiện ích mở rộng của bạn như thế này -> var myDate2 = myDate.toDateTime (); Nó cho tôi một ngày hoàn toàn khác chứ không phải ngày hiện tại.
Arjun Kalidas

9

Dành cho 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

Các đoạn mã trên trang QA này bị "lộn ngược" ...

Điều đầu tiên Apple đề cập là bạn lưu trữ bộ định dạng của bạn ...

Liên kết đến tài liệu của Apple nêu chính xác cách thực hiện việc này:

Bộ định dạng bộ đệm cho hiệu quả Tạo bộ định dạng ngày không phải là một hoạt động rẻ tiền. ... lưu trữ một ví dụ duy nhất ...

Sử dụng toàn cầu ...

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

Sau đó, chỉ cần sử dụng định dạng đó bất cứ nơi nào ...

let s = df.string(from: someDate)

hoặc là

let d = df.date(from: someString)

Hoặc sử dụng bất kỳ phương thức nào khác, nhiều phương pháp thuận tiện trên DateFormatter.

Nó là đơn giản.

(Nếu bạn viết tiện ích mở rộng trên Chuỗi, mã của bạn hoàn toàn "lộn ngược" - bạn không thể sử dụng bất kỳ cuộc gọi dateFormatter nào!)

Lưu ý rằng thông thường bạn sẽ có một vài trong số những quả cầu đó .. chẳng hạn như "formatForClient" "formatForPubNub" "formatForDisplayOnInvoiceScreen" .. vv


Không cần phải để chúng ở phạm vi toàn cầu. Bạn có thể mở rộng Formatter chỉ cần khai báo thuộc tính của bạn tĩnh. kiểm tra stackoverflow.com/a/43658213/2303865
Leo Dabus

4

Swift hỗ trợ phần mở rộng, với phần mở rộng bạn có thể thêm một chức năng mới cho một hiện class, structure, enumeration, hoặcprotocol loại.

Bạn có thể thêm một initchức năng mới vào NSDateđối tượng bằng cách mở rộng đối tượng bằng extensiontừ khóa.

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

Bây giờ bạn có thể khởi tạo một đối tượng NSDate bằng cách sử dụng:

let myDateObject = NSDate(dateString:"2010-12-15 06:00:00")

Tôi thích cách init. Không có cách nào khác để tạo ngày mà không sử dụng timeInterval? Điều gì xảy ra nếu nsdate ngừng có trình khởi tạo với tham số ngày? bạn sẽ giải quyết nó như thế nào? Cá nhân tôi thích cách
khởi xướng

Tôi có một vấn đề: chuỗi ngày của tôi là như thế này: "2017-03-10 22:16:00 +0000" và tôi đã sử dụng định dạng này: "yyyy-MM-dd hh: mm: ss Z" và cái này: "yyyy-MM-dd'THH: mm: ss". Nhưng đối với cả hai, khi tôi làm điều này: hãy bắt đầuDate = df.date(from: beginDateString), tôi sẽ nhận được một con số không! tại sao? ( df = DateFormatter())
Paul Bénéteau

4

Kể từ Swift 3, nhiều tiền tố NS đã bị loại bỏ.

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)

Tôi có một vấn đề: chuỗi ngày của tôi là như thế này: "2017-03-10 22:16:00 +0000" và tôi đã sử dụng định dạng này: "yyyy-MM-dd hh: mm: ss Z" và cái này: "yyyy-MM-dd'THH: mm: ss". Nhưng đối với cả hai, khi tôi làm điều này: hãy bắt đầuDate = df.date(from: beginDateString), tôi sẽ nhận được một con số không! tại sao? ( df = DateFormatter())
Paul Bénéteau

4

Swift 3,4:

2 chuyển đổi hữu ích:

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

Cách sử dụng: 1.

let date = Date() //gives today's 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)

3

CHO 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

    }
}

LƯU Ý: ĐIỀU NÀY S R TRẢ LẠI NGUỒN GỐC XUẤT XỨ NẾU LRI


2

Để thêm Chuỗi trong Định dạng Ngày trong Swift, tôi đã làm điều này

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

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

2

Công việc này đối với tôi ..

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

1

Dưới đây là một số tùy chọn chuyển đổi định dạng chuỗi thành ngày có thể được sử dụng trong iOS nhanh chóng.

  1. Thursday, Dec 27, 2018 định dạng = EEEE, MMM d, yyyy
  2. 12/27/2018 định dạng = MM/dd/yyyy
  3. 12-27-2018 09:59 định dạng = MM-dd-yyyy HH:mm
  4. Dec 27, 9:59 AM định dạng = MMM d, h:mm a
  5. December 2018 định dạng = MMMM yyyy
  6. Dec 27, 2018 định dạng = MMM d, yyyy
  7. Thu, 27 Dec 2018 09:59:19 +0000 định dạng = E, d MMM yyyy HH:mm:ss Z
  8. 2018-12-27T09:59:19+0000 định dạng = yyyy-MM-dd'T'HH:mm:ssZ
  9. 27.12.18 định dạng = dd.MM.yy
  10. 09:59:19.815 định dạng = 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
}

0

Bạn có thể thử mã nhanh chóng này

    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

Chuyển đổi 5 , Xcode 11.0

Vượt qua (ngày trong chuỗi) của bạn ở định dạng "dateString" và ở định dạng "dateFormat" mà bạn muốn. Để chọn định dạng, sử dụng trang web NDateFormatter .

func getDateFrom(dateString: String, dateFormat: String) -> Date? {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = dateFormat
    dateFormatter.locale = Locale(identifier: "en_US")
    guard let date = dateFormatter.date(from: dateString) else {return nil}
    return date
}

-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/l Library / prelelel


2
Công việc này dự định làm như thế nào nhỉ? Trình định dạng ngày không được khởi tạo và cũng không có lý do gì để phân chia khai báo và khởi tạo ngày.
Ixx
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.