Conversão NSDate para NSString

252

Como faço para converter, NSDatepara NSStringque apenas o ano no formato @ "aaaa" seja enviado para a sequência?

4thSpace
fonte

Respostas:

468

E se...

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy"];

//Optionally for time zone conversions
[formatter setTimeZone:[NSTimeZone timeZoneWithName:@"..."]];

NSString *stringFromDate = [formatter stringFromDate:myNSDateInstance];

//unless ARC is active
[formatter release];

Swift 4.2:

func stringFromDate(_ date: Date) -> String {
    let formatter = DateFormatter()
    formatter.dateFormat = "dd MMM yyyy HH:mm" //yyyy
    return formatter.string(from: date)
}
Allan
fonte
24
Isso produzirá um vazamento de memória, pois o formatador nunca é liberado.
mana
6
Não use initcom NSDateFormatter. Foi removido após o iOS 3.2 . (E se você usar um método de classe em vez disso, ele vai autorelease e você não terá o problema de vazamento, também.)
zekel
3
Realmente sugiro olhar abaixo em localizedStringFromDate
Oded Ben Dov
4
@zekel Não tenho certeza do que a documentação costumava dizer, mas agora sugere initem vários lugares.
Neal Ehardt
2
Eu teria autoreleased-lo (3 anos)
Adam Waite
283

Não sei como todos nós perdemos isso: localizedStringFromDate: dateStyle: timeStyle:

NSString *dateString = [NSDateFormatter localizedStringFromDate:[NSDate date] 
                                                      dateStyle:NSDateFormatterShortStyle 
                                                      timeStyle:NSDateFormatterFullStyle];
NSLog(@"%@",dateString);

saídas '13 / 06/12 00:22:39 GMT + 03: 00 '

Oded Ben Dov
fonte
uma vez gravada em uma string, existe uma maneira legal de lê-la dessa maneira? (utilizando esses enumerações NSDateFormatter)
Fonix
@Fonix Acho que não - esta é uma string localizada, o que significa que depende das configurações de localidade do usuário. Você nunca deve armazenar datas em um formato como este, pois as configurações podem mudar a qualquer momento.
Viktor Benei
É bom se você usar o formatador raro. Caso contrário, você precisa de um cache.
Mike Glukhov
In swift: deixe dateString = NSDateFormatter.localizedStringFromDate (date, dateStyle: .ShortStyle, timeStyle: .FullStyle);
Cristan
1
Reduziu o número de códigos e, graças a sua perfeita trabalhando
Preetha
87

Espero agregar mais valor fornecendo o formatador normal, incluindo o ano, o mês e o dia com o horário. Você pode usar este formatador por mais de um ano

[dateFormat setDateFormat: @"yyyy-MM-dd HH:mm:ss zzz"]; 
Al Pascual
fonte
24

existem vários NSDateajudantes na web, eu costumo usar:

https://github.com/billymeltdown/nsdate-helper/

Leia-me abaixo:

  NSString *displayString = [NSDate stringForDisplayFromDate:date];

Isso produz os seguintes tipos de saída:

3:42 AM  if the date is after midnight today
Tuesday  if the date is within the last seven days
Mar 1  if the date is within the current calendar year
Mar 1, 2008  else ;-)
Nik Burns
fonte
Esta é definitivamente uma ótima solução. Não precisa perder tempo se preocupando com a aparência das datas e pode continuar com a codificação. :)
kyleturner 15/10/12
13

Em Swift:

var formatter = NSDateFormatter()
formatter.dateFormat = "yyyy"
var dateString = formatter.stringFromDate(YourNSDateInstanceHERE)
Dave Patrick
fonte
No Swift 3.0, deixe formatter = DateFormatter () formatter.dateFormat = "aaaa" retornar formatter.string (from: date)
Victor Laerte
8
  NSDateFormatter *dateformate=[[NSDateFormatter alloc]init];
  [dateformate setDateFormat:@"yyyy"]; // Date formater
  NSString *date = [dateformate stringFromDate:[NSDate date]]; // Convert date to string
  NSLog(@"date :%@",date);
SR Nayak
fonte
1
"AAAA" fornece o ano para a semana atual, não para o dia. Use "aaaa" em vez disso. Veja esta pergunta para mais informações. stackoverflow.com/questions/15133549/…
Steve Moser
Obrigado Steve Moser :)
SR Nayak
4

Se você não tiver NSDate -descriptionWithCalendarFormat:timeZone:locale:disponível (não acredito que o iPhone / Cocoa Touch inclua isso), talvez seja necessário usar o strftime e o monkey com algumas strings no estilo C. Você pode obter o registro de data e hora do UNIX NSDateusando NSDate -timeIntervalSince1970.

pix0r
fonte
4
+(NSString*)date2str:(NSDate*)myNSDateInstance onlyDate:(BOOL)onlyDate{
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    if (onlyDate) {
        [formatter setDateFormat:@"yyyy-MM-dd"];
    }else{
        [formatter setDateFormat: @"yyyy-MM-dd HH:mm:ss"];
    }

    //Optionally for time zone conversions
    //   [formatter setTimeZone:[NSTimeZone timeZoneWithName:@"..."]];

    NSString *stringFromDate = [formatter stringFromDate:myNSDateInstance];
    return stringFromDate;
}

+(NSDate*)str2date:(NSString*)dateStr{
    if ([dateStr isKindOfClass:[NSDate class]]) {
        return (NSDate*)dateStr;
    }

    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"yyyy-MM-dd"];
    NSDate *date = [dateFormat dateFromString:dateStr];
    return date;
}
Gank
fonte
3

Basta adicionar esta extensão:

extension NSDate {
    var stringValue: String {
        let formatter = NSDateFormatter()
        formatter.dateFormat = "yourDateFormat"
        return formatter.stringFromDate(self)
    }
}
Nazariy Vlizlo
fonte
2

Se você estiver no Mac OS X, pode escrever:

NSString* s = [[NSDate date] descriptionWithCalendarFormat:@"%Y_%m_%d_%H_%M_%S" timeZone:nil locale:nil];

No entanto, isso não está disponível no iOS.

neoneye
fonte
1

resposta rápida 4

static let dateformat: String = "yyyy-MM-dd'T'HH:mm:ss"
public static func stringTodate(strDate : String) -> Date
{

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = dateformat
    let date = dateFormatter.date(from: strDate)
    return date!
}
public static func dateToString(inputdate : Date) -> String
{

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = dateformat
    return formatter.string(from: inputdate)

}
Khurram awan
fonte
0
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [calendar components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:myNSDateInstance];
NSInteger year = [components year];
// NSInteger month = [components month];
NSString *yearStr = [NSString stringWithFormat:@"%ld", year];
Shamsiddin
fonte
0

Defina seu próprio utilitário para formatar sua data, formato de data requerido, por exemplo.

NSString * stringFromDate(NSDate *date)  
 {   NSDateFormatter *formatter
    [[NSDateFormatter alloc] init];  
    [formatter setDateFormat:@"MM ∕ dd ∕ yyyy, hh꞉mm a"];    
    return [formatter stringFromDate:date]; 
}
Aks
fonte
0

É um formato rápido:

func dateFormatterWithCalendar(calndarIdentifier: Calendar.Identifier, dateFormat: String) -> DateFormatter {

    let formatter = DateFormatter()
    formatter.calendar = Calendar(identifier: calndarIdentifier)
    formatter.dateFormat = dateFormat

    return formatter
}


//Usage
let date = Date()
let fotmatter = dateFormatterWithCalendar(calndarIdentifier: .gregorian, dateFormat: "yyyy")
let dateString = fotmatter.string(from: date)
print(dateString) //2018
amin
fonte