ios objective-c nsstring nsdate

ios - Convertir NSString a NSDate(y viceversa)



objective-c (17)

Swift 4 y más tarde

Actualizado: 2018

Cadena hasta la fecha

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)

Fecha a la cadena

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

Actualizado: 20 de julio de 2017

Cadena a 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 a String

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

Rápido

Actualizado: 22 de octubre de 2015

Cadena a 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 a String

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

C objetivo

NSString a NSDate

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

NSDate convertir a NSString:

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

¿Cómo convertiría una NSString como " 01/02/10 " (es decir, el 1 de febrero de 2010) en una NSDate ? ¿Y cómo podría convertir el NSDate nuevo en una cadena?


¿Por qué no agregar una categoría a 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];


Cuando utilice fechas de formato fijo, debe establecer la configuración regional del formateador de fecha en "en_US_POSIX" .

Tomado de la Guía de Formato de Datos

Si está trabajando con fechas de formato fijo, primero debe establecer la configuración regional del formateador de fecha en algo apropiado para su formato fijo. En la mayoría de los casos, la mejor ubicación para elegir es en_US_POSIX, una configuración regional que está diseñada específicamente para generar resultados en inglés de EE. UU. Independientemente de las preferencias del usuario y del sistema . en_US_POSIX también es invariante en el tiempo (si EE. UU., en algún momento en el futuro, cambia la forma en que formatea las fechas, en_US cambiará para reflejar el nuevo comportamiento, pero no lo hará en_US_POSIX), y entre plataformas (en_US_POSIX funciona igual en iPhone OS como lo hace en OS X, y como lo hace en otras plataformas).

Swift 3 o más tarde

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

uso:

// 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"

Analizando la fecha personalizada y volviendo a convertir la fecha al mismo formato de cadena:

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

Aquí están todos los elementos que puede utilizar para personalizarlo según sea necesario:


Fecha de NSString

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

NSString a 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


Hecho una extensión NSString para eso.

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

Gracias a NSDataDetector , reconoce una gran cantidad de formatos.

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

eppz!kit parte de eppz!kit , NSString+EPPZKit.h la categoría NSString+EPPZKit.h de GitHub.

RESPUESTA ORIGINAL: Si no está seguro (o no le importa) sobre el formato de fecha contenido en la cadena, use NSDataDetector para la fecha de análisis .

//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; }];


Lo mejor es crear una clase general en la que coloque todos sus métodos de uso general, métodos útiles en casi todos los proyectos y agregue el código sugerido por @Pavan como:

+ (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; }

.. y así sucesivamente para todos los demás métodos útiles

Al hacerlo, comienza a construir un código limpio y reutilizable para su aplicación. ¡Aclamaciones!


Los ejemplos anteriores no están simplemente escritos para Swift 3.0+

Actualización - Swift 3.0+ - Convertir fecha en cadena

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)


Puedes usar extensiones para esto.

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

Así, mientras que la ejecución del código real se verá como sigue

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

También hay algunos métodos predeterminados, pero supongo que puede que no funcione con el formato que proporcionó en la documentación.

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


Si alguien está interesado en hacer algo como esto en Swift en estos días, tengo un comienzo en algo, aunque no sea perfecto.

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


Utilice este método para convertir de NSString a NSdate :

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


usar "10" para representar un año no es bueno, porque puede ser 1910, 1810, etc. Probablemente debería usar 4 dígitos para eso.

Si puedes cambiar la fecha a algo como

yyyymmdd

Entonces puedes usar:

// 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];


Cadena hasta la fecha

var dateFormatter = DateFormatter() dateFormatter.format = "dd/MM/yyyy" var dateFromString: Date? = dateFormatter.date(from: dateString) //pass string here

Fecha a la cadena

var dateFormatter = DateFormatter() dateFormatter.dateFormat = "dd-MM-yyyy" let newDate = dateFormatter.string(from: date) //pass Date here


NSString a NSDate o NSDate a 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; }


Según Swift 2.2

Puede obtener fácilmente NSDate desde String y String desde NSDate. p.ej

Formato de fecha del primer set

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

Ahora consigue fecha de cadena y viceversa.

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

Ahora disfruta.


// 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];


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];


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

Si desea configurar el formato utilice el siguiente código:

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]);