Formatando o NSDate em estilos específicos para ano, mês, dia e hora, minuto, segundos

132

Basicamente, preciso obter a data e a hora atuais separadamente, formatadas como:

26-04-2009 
11:06:54

O código abaixo, de outra pergunta sobre o mesmo tópico, gera

now: | 2009-06-01 23:18:23 +0100 | 
dateString: | 01 de junho de 2009 23: 18 | 
analisado: | 2009-06-01 23:18:00 +0100 |

É quase o que estou procurando, mas quero separar o dia e a hora.

NSDateFormatter *format = [[NSDateFormatter alloc] init];
[format setDateFormat:@"MMM dd, yyyy HH:mm"];

NSDate *now = [[NSDate alloc] init];

NSString *dateString = [format stringFromDate:now];

NSDateFormatter *inFormat = [[NSDateFormatter alloc] init];
[inFormat setDateFormat:@"MMM dd, yyyy"];

NSDate *parsed = [inFormat dateFromString:dateString];

NSLog(@"\n"
"now:        |%@| \n"
"dateString: |%@| \n"
"parsed:     |%@|", now, dateString, parsed);
bcsantos
fonte
1
Em um caso como esse em que você gastou um tempo para escrever o código que acabou usando para resolver o problema, eu provavelmente o colocaria (neste caso, tudo abaixo de edit2) em uma resposta, em vez de uma edição em sua postagem. De qualquer maneira, não é grande coisa, mas torna um pouco mais fácil descobrir / ver que é uma solução para a pergunta.
31430 Lawrence Johnston

Respostas:

72

As sequências de formato do iPhone estão no formato Unicode . Por trás do link, há uma tabela explicando o significado de todas as letras acima para que você possa criar suas próprias.

E, claro, não se esqueça de liberar seus formatadores de data quando terminar. O código acima vazamentos format, now, e inFormat.

Rob Napier
fonte
Ele vaza mesmo com o ARC ativado?
Dimme
19
O exposto acima não terá vazamentos no ARC (é claro que o ARC não estava disponível em 2009 quando estávamos discutindo).
Rob Napier
194

isto é o que eu usei:

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"yyyy-MM-dd"];

NSDateFormatter *timeFormat = [[NSDateFormatter alloc] init];
[timeFormat setDateFormat:@"HH:mm:ss"];

NSDate *now = [[NSDate alloc] init];

NSString *theDate = [dateFormat stringFromDate:now];
NSString *theTime = [timeFormat stringFromDate:now];

NSLog(@"\n"
      "theDate: |%@| \n"
      "theTime: |%@| \n"
      , theDate, theTime);

[dateFormat release];
[timeFormat release];
[now release];
bcsantos
fonte
12

você pode usar esse método, basta passar sua data para ele

-(NSString *)getDateFromString:(NSString *)string
{

    NSString * dateString = [NSString stringWithFormat: @"%@",string];

    NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"your current date format"];
    NSDate* myDate = [dateFormatter dateFromString:dateString];

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"your desired format"];
    NSString *stringFromDate = [formatter stringFromDate:myDate];

    NSLog(@"%@", stringFromDate);
    return stringFromDate;
}
guru
fonte
11
    NSDateFormatter *dateformat = [[NSDateFormatter alloc] init];
    [dateformat setDateFormat:@"Your Date Format"];

definir o formato para retornar é ....

yyyy-MM-dd2015-12-17data de retorno

yyyy-MMM-dd2015-Dec-17data de retorno

yy-MM-dd15-12-17data de retorno

dd-MM-yy17-12-15data de retorno

dd-MM-yyyy17-12-2015data de retorno

yyyy-MMM-dd HH:mm:ss2015-Dec-17 08:07:13data e hora de retorno

yyyy-MMM-dd HH:mm2015-Dec-17 08:07data e hora de retorno

Para mais detalhes Formato de dados e hora para Clique agora.

Obrigado.....

PT Vyas
fonte
1
Forneça descrição adicional junto com o exemplo de código.
Maciej Lach
Eu tenho esta data '2018-06-08T07: 30: 05.391Z' eu tentei 'aaaa-MM-dd'T'HH: mm: ss.000Z' mas obtendo valor nulo.
Pramod Tapaniya
4

nada de novo, mas ainda quero compartilhar meu método:

+(NSString*) getDateStringFromSrcFormat:(NSString *) srcFormat destFormat:(NSString *)
destFormat scrString:(NSString *) srcString
{
    NSString *dateString = srcString;
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    //[dateFormatter setDateFormat:@"MM-dd-yyyy"];
    [dateFormatter setDateFormat:srcFormat];
    NSDate *date = [dateFormatter dateFromString:dateString];

    // Convert date object into desired format
    //[dateFormatter setDateFormat:@"yyyy-MM-dd"];
    [dateFormatter setDateFormat:destFormat];
    NSString *newDateString = [dateFormatter stringFromDate:date];
    return newDateString;
}
gndp
fonte
3

Para rápida

var dateString:String = "2014-05-20";
var dateFmt = NSDateFormatter()
// the format you want
dateFmt.dateFormat = "yyyy-MM-dd"
var date1:NSDate = dateFmt.dateFromString(dateString)!;

fonte
0

Swift 3

extension Date {
    
    func toString(template: String) -> String {
        let formatter = DateFormatter()
        formatter.dateFormat = DateFormatter.dateFormat(fromTemplate: template, options: 0, locale: NSLocale.current)
        return formatter.string(from: self)
    }
    
}

Uso

let now = Date()
let nowStr0 = now.toString(template: "EEEEdMMM") // Tuesday, May 9
let nowStr1 = now.toString(template: "yyyy-MM-dd") // 2017-05-09
let nowStr2 = now.toString(template: "HH:mm:ss") // 17:47:09

Brinque com o modelo para atender às suas necessidades. Exemplos e documentos aqui para ajudá-lo a criar o modelo necessário.

Nota

Você pode querer armazenar em cache o seu DateFormatterse planeja usá-lo, TableViewpor exemplo. Para se ter uma ideia, o loop acima de 1000 datas levou 0,5 segundos usando a toString(template: String)função acima , comparado a 0,05 segundos usando myFormatter.string(from: Date).

frouo
fonte
Para tornar essa nota mais forte (porque é muito importante), você pode refatorar sua função para usar um parâmetro opcional com um valor padrão da nova instância. Eu não sei por que você foi votado, então eu estou votando.
Vive
-6
NSDate *date         = [NSDate date];
NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"yyyy-MM-dd"]
NSString *dateString  = [df stringFromDate:date];
[df setDateFormat:@"hh:mm:ss"];
NSString *hoursString = [df stringFromDate:date];

É isso, você conseguiu tudo o que deseja.

Nikesh K
fonte