iPhone OS: ¿Cómo creo una NSDate para una fecha específica?

Respuestas:

211

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

NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setDay:10];
[comps setMonth:10];
[comps setYear:2010];
NSDate *date = [[NSCalendar currentCalendar] dateFromComponents:comps];
Oded Ben Dov
fuente
7
Nota también hay setHour, setMinute, setSecond, etc., para una granularidad más fina.
devios1
19

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.

Kamleshwar
fuente
Tenga cuidado al usar la función "dateFromString": descubrí que con algunas fechas perfectamente válidas, fallaría miserablemente. Vea mi publicación a continuación para obtener una forma alternativa de analizar cadenas de fecha.
Mike Gledhill
La forma en que Oded Ben menciona es también otra mejor forma ..... NSDateComponents * comps = [[NSDateComponents alloc] init]; [comps setDay: 10]; [comps setMonth: 10]; [comps setYear: 2010]; NSDate * fecha = [[NSCalendar currentCalendar] dateFromComponents: comps];
Kamleshwar
16

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

Arrojar
fuente
9

Ejemplos rápidos

Los ejemplos suelen ser la forma más fácil de aprender. Aquí están algunos ejemplos.

Ahora

Éste 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)

¿Necesitas más detalles ...?

También hay otras formas de crear fechas. Si desea aprenderlos, además de cómo mostrar una fecha, consulte mi respuesta más completa .

Suragch
fuente
8

Consulte la documentación de NSDate . Puede utilizar el dateFromString:método de NSDateFormattero el dateFromComponents:método de NSCalendar.

zoul
fuente
Sigo recibiendo esta fecha: "1969-12-31 16:00:00" -0800 cuando uso la fecha de la cadena
nickthedude
NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init]; NSDate * captureStartDate = [dateFormatter dateFromString: @ "2 de enero de 2001"]; NSLog (@ "% @", [captureStartDate descripción]); salida: 2010-04-05 10: 49: 47.688 Calendar2 [21339: 207] 1969-12-31 16:00:00
-0800
¿Quizás necesite establecer algunos parámetros en la fecha formateada en lugar de simple init?
zoul
3

Encontré este hilo mientras buscaba una respuesta a esta pregunta, pero luego encontré un buen ejemplo en uno de mis libros de Programación Objective-C de Big Nerd Ranch. Crédito a ellos, no a 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];
Lev Chlumov
fuente
2

Es ridículo, ¿no?

A mediados de 2013, Apple aún no ha proporcionado una forma sencilla de establecer un valor NSDate.

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

De todos modos, aquí está la clase auxiliar 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

Con este código, puede 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 descubrí que a veces , simplemente no se analizaba y devolvía 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 falló estrepitosamente el "12 de octubre de 2012" ... por eso me di por vencido y utilicé la función "parseDateString" más complicada que se muestra arriba.

Mi punto es ... ten cuidado.

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

Mike Gledhill
fuente