iPhone OS: como faço para criar um NSDate para uma data específica?

Respostas:

211

A resposta de @ Chuck está correta e me leva ao seguinte código. Pensei em compartilhar:

NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setDay:10];
[comps setMonth:10];
[comps setYear:2010];
NSDate *date = [[NSCalendar currentCalendar] dateFromComponents:comps];
Oded Ben Dov
fonte
7
Nota também há setHour, setMinute, setSecond, etc. de granularidade.
devios1
19

Você pode usar isso

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

Espero que isso ajude você.

Kamleshwar
fonte
Tenha cuidado ao usar a função "dateFromString" - descobri que, com algumas datas perfeitamente válidas, ela falharia terrivelmente. Veja minha postagem abaixo para uma maneira alternativa de analisar strings de data.
Mike Gledhill
A maneira como o Oded Ben menciona também é outra melhor maneira ..... NSDateComponents * comps = [[NSDateComponents alloc] init]; [comps setDay: 10]; [comps setMonth: 10]; [comps setYear: 2010]; NSDate * date = [[NSCalendar currentCalendar] dateFromComponents: comps];
Kamleshwar
16

Se você está falando sobre uma data de calendário específica em vez de uma data UNIXy, provavelmente deseja o NSCalendar dateFromComponents:.

Mandril
fonte
9

Exemplos rápidos

Os exemplos costumam ser a maneira mais fácil de aprender. Aqui estão alguns exemplos.

Agora

Este é o mais fácil.

let currentDateTime = Date()

20 de fevereiro 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)

Precisa de mais detalhes ...?

Existem outras maneiras de criar datas também. Se você quiser aprender isso, e também como exibir uma data, veja minha resposta mais completa .

Suragch
fonte
8

Consulte a documentação para NSDate . Você pode usar o dateFromString:método de NSDateFormatterou o dateFromComponents:método de NSCalendar.

zoul
fonte
Continuo recebendo esta data: "1969-12-31 16:00:00" -0800 ao usar data de string
nickthedude
NSDateFormatter * dateFormatter = [[NSDateFormatter aloc] init]; NSDate * captureStartDate = [dateFormatter dateFromString: @ "2 de janeiro de 2001"]; NSLog (@ "% @", [descrição captureStartDate]); saída: 2010-04-05 10: 49: 47.688 Calendar2 [21339: 207] 1969-12-31 16:00:00 -0800
nickthedude
Talvez você precise definir alguns parâmetros na data formatada em vez de simples init?
zoul
3

Eu encontrei este tópico enquanto procurava uma resposta para esta pergunta, mas então eu encontrei um bom exemplo em um meu livro Big Nerd Ranch Objective-C Programming. Crédito para eles, não para mim.

  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
fonte
2

É ridículo, não é?

Meados de 2013 e a Apple ainda não forneceram uma maneira simples de definir um valor NSDate.

Durante meu projeto atual do iPad, não pude acreditar que tive que interromper a produtividade por um tempo para escrever minha própria classe de ajudante para obter o valor de ano de um NSDate. Quero dizer, vamos, isso é básico.

De qualquer forma, aqui está a classe auxiliar que usei em meu projeto, para converter uma string em um 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, você pode definir um valor NSDate usando algo como:

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

Nota: esta função foi baseada no código retirado daqui: https://stackoverflow.com/a/3968411/391605

Minha solução era usar o código a seguir, mas descobri que às vezes ele simplesmente não analisava e retornava 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];

Lembro que falhou miseravelmente em "12 de outubro de 2012" ... é por isso que desisti e usei a função mais complicada "parseDateString" mostrada acima.

Meu ponto é ... tenha cuidado.

Algumas das funções básicas do NSDate simplesmente não funcionam corretamente ...

Mike Gledhill
fonte