iPhone OS: ¿Cómo puedo crear un NSDate para una fecha específica?


Parece una cosa simple, pero no puedo encontrar una manera de hacerlo.

Sería genial ver un par de métodos diferentes.

Author: Suragch, 2010-04-05

7 answers

La respuesta de@Chuck es correcta, y llévame al siguiente código. Pensé en compartir:

NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setDay:10];
[comps setMonth:10];
[comps setYear:2010];
NSDate *date = [[NSCalendar currentCalendar] dateFromComponents:comps];
 198
Author: Oded Ben Dov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-22 22:52:33

Puedes usar esto

NSString *dateString = @"03-Sep-11";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"dd-MMM-yy";
NSDate *date = [dateFormatter dateFromString:dateString];

Espero que esto te ayude.

 18
Author: kamleshwar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-29 09:30:39

Si estás hablando de una fecha de calendario específica en lugar de una fecha UNIXy, probablemente quieras dateFromComponents: de NSCalendar.

 16
Author: Chuck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-05 17:23:31

Ejemplos Swift

Los ejemplos suelen ser la forma más fácil de aprender. He aquí algunos ejemplos.

Ahora

Este es el más fácil.

let currentDateTime = Date()

20 de febrero de 2017

// Specify date components
var dateComponents = DateComponents()
dateComponents.year = 2017
dateComponents.month = 2
dateComponents.day = 20

// Create date from components
let userCalendar = Calendar.current // user calendar
let dateThisPostWasUpdated = userCalendar.date(from: dateComponents)

1 de abril de 1976

// Specify date components
var dateComponents = DateComponents()
dateComponents.year = 1976
dateComponents.month = 4
dateComponents.day = 1

// Create date from components
let userCalendar = Calendar.current // user calendar
let appleFoundedDate = userCalendar.date(from: dateComponents)

Necesito más detalles...?

También hay otras formas de crear fechas. Si quieres aprender eso, así como cómo mostrar una fecha, entonces ver mi respuesta más completa.

 9
Author: Suragch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-11 23:06:23

Ver la documentación para NSDate. Usted puede utilizar el dateFromString: método de NSDateFormatter o la dateFromComponents: método de NSCalendar.

 8
Author: zoul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-05 17:23:03

Encontré este hilo mientras buscaba una respuesta a esta pregunta, pero luego encontré un buen ejemplo en uno de mis grandes Nerd Ranch Objective-C Programming book. El crédito es para ellos, no para mí.

  NSDateComponents *myBDay  =[[NSDateComponents alloc] init];
    [myBDay setDay:22];
    [myBDay setMonth: 04];
    [myBDay setYear: 1984];
    [myBDay setHour:9];
    [myBDay setMinute:25];
    [myBDay setSecond:35];

    NSCalendar *g = [[ NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    NSDate *dateOfBirth = [g dateFromComponents:myBDay];
 3
Author: Lev Chlumov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-30 04:43:01

Es ridículo, ¿no ?

Mediados de 2013 y Apple todavía no ha proporcionado una forma sencilla de establecer un valor NSDate.

Durante mi actual proyecto de iPad, no podía creer que tuviera que detener la productividad por un tiempo para escribir mi propia clase de ayudante para obtener el valor del año de una NSDate. Quiero decir, vamos, esto es algo básico.

De todos modos, aquí está la clase helper que usé en mi proyecto, para convertir una cadena en un valor NSDate :

@implementation DateHelper

+(NSDate*)parseDateString:(NSString *)dateString
{
    NSDateFormatter *rfc3339TimestampFormatterWithTimeZone = [[NSDateFormatter alloc] init];
    [rfc3339TimestampFormatterWithTimeZone setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];
    [rfc3339TimestampFormatterWithTimeZone setDateFormat:@"MMM dd, yyyy"];

    NSDate *theDate = nil;
    NSError *error = nil;
    if (![rfc3339TimestampFormatterWithTimeZone getObjectValue:&theDate forString:dateString range:nil error:&error]) {
        NSLog(@"Date '%@' could not be parsed: %@", dateString, error);
    }

    return theDate;
}

@end

Usando este código, usted podría establecer un valor NSDate usando algo como:

NSDate* date = [DateHelper parseDateString:@"Jul 16, 2013"];

Nota: esta función se basó en el código tomado de aquí: https://stackoverflow.com/a/3968411/391605

Mi solución había sido usar el siguiente código, pero encontré que a veces, simplemente no analizaba, y regresaba nil.

//  Take a date string in the format "Oct 23, 2013", and convert it into a NSDate value
//  THIS DOESN'T WORK !  DON'T TRUST THIS CODE !!
NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"MMM dd, yyyy"];
[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

NSDate* date = [formatter dateFromString:dateString];

Recuerdo que fracasó miserablemente en "Oct 12, 2012"... por eso me rendí y usé la función "parseDateString" más complicada que se muestra arriba.

Mi punto es... ten cuidado.

Algunas de las funciones muy básicas de NSDate simplemente no funcionan correctamente...

 2
Author: Mike Gledhill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:24