Converting String to Date (and back again) iOS

匿名 (未验证) 提交于 2019-12-03 01:49:02

问题:

How would I convert an NSString like "01/02/10" (meaning 1st February 2010) into an NSDate? And how could I turn the NSDate back into a string?

回答1:

Swift 4 and later

Updated: 16th November 2017

String to Date

var dateString = "02-03-2017" var dateFormatter = DateFormatter()  // This is important - we set our input date format to match our input string // if the format doesn't match you'll get nil from your string, so be careful dateFormatter.dateFormat = "dd-MM-yyyy"  //`date(from:)` returns an optional so make sure you unwrap when using.  var dateFromString: Date? = dateFormatter.date(from: dateString) 

Date to String

var formatter = DateFormatter() formatter.dateFormat = "dd-MM-yyyy" guard let unwrappedDate = dateFromString else { return }  //Using the dateFromString variable from before.  let stringDate: String = formatter.string(from: dateFromString) 

Swift 3

Updated: 20th July 2017

String to NSDate

var dateString = "02-03-2017" var dateFormatter = DateFormatter() // This is important - we set our input date format to match our input string // if the format doesn't match you'll get nil from your string, so be careful dateFormatter.dateFormat = "dd-MM-yyyy" var dateFromString = dateFormatter.date(from: dateString) 

NSDate to String

var formatter = DateFormatter() formatter.dateFormat = "dd-MM-yyyy" let stringDate: String = formatter.string(from: dateFromString) 

Swift

Updated: 22nd October 2015

String to NSDate

var dateString = "01-02-2010" var dateFormatter = NSDateFormatter() // this is imporant - we set our input date format to match our input string dateFormatter.dateFormat = "dd-MM-yyyy" // voila! var dateFromString = dateFormatter.dateFromString(dateString) 

NSDate to String

var formatter = NSDateFormatter() formatter.dateFormat = "dd-MM-yyyy" let stringDate: String = formatter.stringFromDate(NSDate()) println(stringDate) 

Objective-C

NSString to NSDate

NSString *dateString = @"01-02-2010"; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"dd-MM-yyyy"]; NSDate *dateFromString = [dateFormatter dateFromString:dateString]; 

NSDate convert to NSString:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"dd-MM-yyyy"]; NSString *stringDate = [dateFormatter stringFromDate:[NSDate date]]; NSLog(@"%@", stringDate); 


回答2:

Made an NSString extension for that.

// Simple as this.    date = dateString.dateValue; 

Thanks to NSDataDetector, it recognizes a whole lot of format.

'2014-01-16' dateValue is 14-01-16 11:00:00 +0000> '2014.01.16' dateValue is 14-01-16 11:00:00 +0000> '2014/01/16' dateValue is 14-01-16 11:00:00 +0000> '2014 Jan 16' dateValue is 14-01-16 11:00:00 +0000> '2014 Jan 16th' dateValue is 14-01-16 11:00:00 +0000> '20140116' dateValue is 14-01-16 11:00:00 +0000> '01-16-2014' dateValue is 14-01-16 11:00:00 +0000> '01.16.2014' dateValue is 14-01-16 11:00:00 +0000> '01/16/2014' dateValue is 14-01-16 11:00:00 +0000> '16 January 2014' dateValue is 14-01-16 11:00:00 +0000> '01-16-2014 17:05:05' dateValue is 14-01-16 16:05:05 +0000> '01-16-2014 T 17:05:05 UTC' dateValue is 14-01-16 17:05:05 +0000> '17:05, 1 January 2014 (UTC)' dateValue is 14-01-01 16:05:00 +0000> 

Part of eppz!kit, grab the category NSString+EPPZKit.h from GitHub.


ORIGINAL ANSWER: Whether you're not sure (or don't care) about the date format contained in the string, use NSDataDetector for parsing date.

//Role players. NSString *dateString = @"Wed, 03 Jul 2013 02:16:02 -0700"; __block NSDate *detectedDate;  //Detect. NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingAllTypes error:nil]; [detector enumerateMatchesInString:dateString                            options:kNilOptions                              range:NSMakeRange(0, [dateString length])                         usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { detectedDate = result.date; }]; 


回答3:

When using fixed-format dates you need to set the date formatter locale to "en_US_POSIX".

Taken from the Data Formatting Guide

If you're working with fixed-format dates, you should first set the locale of the date formatter to something appropriate for your fixed format. In most cases the best locale to choose is en_US_POSIX, a locale that's specifically designed to yield US English results regardless of both user and system preferences. en_US_POSIX is also invariant in time (if the US, at some point in the future, changes the way it formats dates, en_US will change to reflect the new behavior, but en_US_POSIX will not), and between platforms (en_US_POSIX works the same on iPhone OS as it does on OS X, and as it does on other platforms).

Swift 3 or later

extension Formatter {     static let customDate: DateFormatter = {         let formatter = DateFormatter()         formatter.locale = Locale(identifier: "en_US_POSIX")         formatter.dateFormat = "dd/MM/yy"         return formatter     }()     static let time: DateFormatter = {         let formatter = DateFormatter()         formatter.locale = Locale(identifier: "en_US_POSIX")         formatter.dateFormat = "HH:mm"         return formatter     }()     static let weekdayName: DateFormatter = {         let formatter = DateFormatter()         formatter.dateFormat = "cccc"         return formatter     }()     static let month: DateFormatter = {         let formatter = DateFormatter()         formatter.dateFormat = "LLLL"         return formatter     }() } 

extension Date {     var customDate: String {         return Formatter.customDate.string(from: self)     }     var customTime: String {         return Formatter.time.string(from: self)     }     var weekdayName: String {         return Formatter.weekdayName.string(from: self)     }     var monthName: String {         return Formatter.month.string(from: self)     } }  extension String {     var customDate: Date? {         return Formatter.customDate.date(from: self)     } } 

usage:

// this will be displayed like this regardless of the user and system preferences Date().customTime          //  "16:50" Date().customDate          //  "06/05/17" // this will be displayed according to user and system preferences Date().weekdayName         //  "Saturday" Date().monthName           //  "May" 

Parsing the custom date and converting the date back to the same string format:

let dateString = "01/02/10"  if let date = dateString.customDate {     print(date.customDate)   // "01/02/10\n"     print(date.monthName)    // customDate } 

Here it is all elements you can use to customize it as necessary:



回答4:

Why not add a category to NSString?

// NSString+Date.h @interface NSString (Date) + (NSDate*)stringDateFromString:(NSString*)string; + (NSString*)stringDateFromDate:(NSDate*)date; @end   // NSString+Date.m NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; [dateFormatter setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss ZZZ"];  NSDate *date = [dateFormatter dateFromString:stringDate ]; [dateFormatter release]; + (NSDateFormatter*)stringDateFormatter {     static NSDateFormatter* formatter = nil;     if (formatter == nil)     {         formatter = [[NSDateFormatter alloc] init];         [formatter setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss ZZZ"];     }        return formatter; }  + (NSDate*)stringDateFromString:(NSString*)string {     return [[NSString stringDateFormatter] dateFromString:string]; }  + (NSString*)stringDateFromDate:(NSDate*)date {     return [[NSString stringDateFormatter] stringFromDate:date]; }   // Usage (#import "NSString+Date.h") or add in "YOUR PROJECT".pch file NSString* string = [NSString stringDateFromDate:[NSDate date]]; NSDate* date = [NSString stringDateFromString:string]; 


回答5:

using "10" for representing a year is not good, because it can be 1910, 1810, etc. You probably should use 4 digits for that.

If you can change the date to something like

yyyymmdd 

Then you can use:

// Convert string to date object NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; [dateFormat setDateFormat:@"yyyyMMdd"]; NSDate *date = [dateFormat dateFromString:dateStr];    // Convert date object to desired output format [dateFormat setDateFormat:@"EEEE MMMM d, YYYY"]; dateStr = [dateFormat stringFromDate:date];   [dateFormat release]; 


回答6:

NSString *dateStr = @"Tue, 25 May 2010 12:53:58 +0000";  // Convert string to date object NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; [dateFormat setDateFormat:@"EE, d LLLL yyyy HH:mm:ss Z"]; NSDate *date = [dateFormat dateFromString:dateStr];  [dateFormat release]; 


回答7:

// Convert string to date   NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; [dateFormat setDateFormat:@"yyyyMMdd"]; NSDate *date = [dateFormat dateFromString:dateStr];    // Convert Date to string  [dateFormat setDateFormat:@"EEEE MMMM d, YYYY"]; dateStr = [dateFormat stringFromDate:date];   [dateFormat release]; 


回答8:

NSString *mystr=@"Your string date";  NSCalendar *cal = [NSCalendar currentCalendar]; NSDate *now = [dateFormatter dateFromString:mystr];  Nslog(@"%@",now); 

If you want set the format use below code:

NSString *dateString = @"01-02-2010"; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];  // this is important - we set our input date format to match our input string // if format doesn't match you'll get nil from your string, so be careful [dateFormatter setDateFormat:@"dd-MM-yyyy"]; NSDate *dateFromString = [[NSDate alloc] init];  // voila! dateFromString = [dateFormatter dateFromString:dateString]; Nslog(@"%@",[dateFormatter dateFromString:dateString]); 


回答9:

Use this method to convert from NSString to NSdate:

-(NSDate *)getDateFromString:(NSString *)pstrDate {     NSDateFormatter* myFormatter = [[NSDateFormatter alloc] init];     [myFormatter setDateFormat:@"dd/MM/yyyy"];     NSDate* myDate = [myFormatter dateFromString:pstrDate];     return myDate; } 


回答10:

If anyone is interested in doing something like this in Swift these days, I have a start on something, although it's not perfect.

func detectDate(dateString: NSString) -> NSDate {      var error: NSError?     let detector: NSDataDetector = NSDataDetector.dataDetectorWithTypes(NSTextCheckingType.Date.toRaw(), error: &error)!      if error == nil {         var matches = detector.matchesInString(dateString, options: nil, range: NSMakeRange(0, dateString.length))          let currentLocale = NSLocale.currentLocale()         for match in matches {             match.resultType == NSTextCheckingType.Date             NSLog("Date: \(match.date.description)")             return match.date         }     }     return NSDate() } 


回答11:

Date to NSString

NSString *dateString = [NSString stringWithFormat:@"%@",[NSDate date]]; NSLog(@"string: %@",dateString ); //2015-03-24 12:28:49 +0000 

NSString to NSDate

NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss Z"]; NSDate *date = [formatter dateFromString:dateString]; NSLog(@"date: %@", date); //015-03-24 12:28:49 +0000 


回答12:

You can use extensions for this.

extension NSDate {     //NSString to NSDate     convenience     init(dateString:String) {         let nsDateFormatter = NSDateFormatter()         nsDateFormatter.dateFormat = "yyyy-MM-dd hh:mm:ss"         // Add the locale if required here         let dateObj = nsDateFormatter.dateFromString(dateString)         self.init(timeInterval:0, sinceDate:dateObj!)     }      //NSDate to time string     func getTime() -> String {         let timeFormatter = NSDateFormatter()         timeFormatter.dateFormat = "hh:mm"         //Can also set the default styles for date or time using .timeStyle or .dateStyle         return timeFormatter.stringFromDate(self)     }      //NSDate to date string     func getDate() -> String {         let dateFormatter = NSDateFormatter()         dateFormatter.dateFormat = "dd, MMM"         return dateFormatter.stringFromDate(self)     }      //NSDate to String     func getString() -> String {         let dateFormatter = NSDateFormatter()         dateFormatter.dateFormat = "yyyy-MM-dd hh:mm:ss"         return dateFormatter.stringFromDate(self)     } } 

So while execution actual code will look like follows

    var dateObjFromString = NSDate(dateString: cutDateTime)     var dateString = dateObjFromString.getDate()     var timeString = dateObjFromString.getTime()     var stringFromDate = dateObjFromString.getString() 

There are some defaults methods as well but I guess it might not work for the format you have given from documentation

    -dateFromString(_:)     -stringFromDate(_:)     -localizedStringFromDate(_ date: NSDate,                      dateStyle dateStyle: NSDateFormatterStyle,                      timeStyle timeStyle: NSDateFormatterStyle) -> String 


回答13:

Best practice is to build yourself a general class where you put all your general use methods, methods useful in almost all projects and there add the code suggested by @Pavan as:

+ (NSDate *)getDateOutOfString:(NSString *)passedString andDateFormat:(NSString *)dateFormat{      NSString *dateString = passedString;     NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];     [dateFormatter setDateFormat:dateFormat];     NSDate *dateFromString = [[NSDate alloc] init];     dateFromString = [dateFormatter dateFromString:dateString];     return dateFromString;  } 

.. and so on for all other useful methods

By doing so you start building a clean reusable code for you app. Cheers!



回答14:

As per Swift 2.2

You can get easily NSDate from String and String from NSDate. e.g.

First set date formatter

let formatter = NSDateFormatter(); formatter.dateStyle = NSDateFormatterStyle.MediumStyle formatter.timeStyle = .NoStyle formatter.dateFormat = "MM/dd/yyyy" 

Now get date from string and vice versa.

let strDate = formatter.stringFromDate(NSDate()) print(strDate) let dateFromStr = formatter.dateFromString(strDate) print(dateFromStr) 

Now enjoy.



回答15:

NSString to NSDate or NSDate to NSString

//This method is used to get NSDate from string  //Pass the date formate ex-"dd-MM-yyyy hh:mm a" + (NSDate*)getDateFromString:(NSString *)dateString withFormate:(NSString *)formate  {      // Converted date from date string     NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];     [dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]];     [dateFormatter setDateFormat:formate];     NSDate *convertedDate         = [dateFormatter dateFromString:dateString];     return convertedDate; }  //This method is used to get the NSString for NSDate //Pass the date formate ex-"dd-MM-yyyy hh:mm a" + (NSString *)getDateStringFromDate:(NSDate *)date withFormate:(NSString *)formate {      // Converted date from date string     NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];     //[dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]];     [dateFormatter setDateFormat:formate];     NSString *convertedDate         = [dateFormatter stringFromDate:date];     return convertedDate; } 


回答16:

The above examples aren't simply written for Swift 3.0+

Update - Swift 3.0+ - Convert Date To String

let date = Date() // insert your date data here var dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd" // add custom format if you'd like  var dateString = dateFormatter.string(from: date) 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!