Convertir NSDate a NSString

Respuestas:

468

Qué tal si...

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)
}
Alano
fuente
24
Esto producirá una pérdida de memoria, ya que el formateador nunca se libera.
mana
66
No lo uses initcon NSDateFormatter. Fue eliminado después de iOS 3.2 . (Y si se utiliza un método de clase en su lugar, se AutoRelease y usted no tendrá el problema de pérdida, también.)
zekel
3
Realmente sugiero mirar a continuación en localizedStringFromDate
Oded Ben Dov
44
@zekel No estoy seguro de lo que la documentación solía decir, pero ahora sugiere initen varios lugares.
Neal Ehardt
2
Lo habría lanzado automáticamente (hace 3 años)
Adam Waite
283

No sé cómo todos nos perdimos esto: localizedStringFromDate: dateStyle: timeStyle:

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

salidas '13 / 06/12 00:22:39 GMT + 03: 00 '

Oded Ben Dov
fuente
una vez escrito en una cadena, ¿hay una buena forma ordenada de leerlo así? (usando esas enumeraciones NSDateFormatter)
Fonix
@Fonix No lo creo, esta es una cadena localizada, lo que significa que depende de la configuración regional del usuario. Nunca debe almacenar fechas en un formato como este porque la configuración puede cambiar en cualquier momento.
Viktor Benei
Es bueno si usas el formateador raro. De lo contrario, necesita un caché.
Mike Glukhov
En forma rápida: let dateString = NSDateFormatter.localizedStringFromDate (date, dateStyle: .ShortStyle, timeStyle: .FullStyle);
Cristan
1
Se redujo la cantidad de códigos y se agradece su perfecto funcionamiento
Preetha
87

Esperamos agregar más valor al proporcionar el formateador normal, incluido el año, mes y día con la hora. Puedes usar este formateador por más de un año

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

hay una serie de NSDateayudantes en la web, tiendo a usar:

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

Extracto de léame a continuación:

  NSString *displayString = [NSDate stringForDisplayFromDate:date];

Esto produce los siguientes tipos de salida:

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
fuente
Esta es definitivamente una gran solución. No tiene que perder el tiempo preocupándose por cómo quiere que se vean sus fechas, y puede continuar con la codificación. :)
kyleturner
13

En Swift:

var formatter = NSDateFormatter()
formatter.dateFormat = "yyyy"
var dateString = formatter.stringFromDate(YourNSDateInstanceHERE)
Dave Patrick
fuente
En Swift 3.0, deje que formatter = DateFormatter () formatter.dateFormat = "aaaa" devuelva formatter.string (desde: fecha)
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
fuente
1
"AAAA" da el año para la semana actual, no el día. Use "aaaa" en su lugar. Vea esta pregunta SO para más información. stackoverflow.com/questions/15133549/…
Steve Moser
Gracias Steve moser :)
SR Nayak
4

Si no tienes NSDate -descriptionWithCalendarFormat:timeZone:locale:disponible (no creo que iPhone / Cocoa Touch incluya esto), es posible que necesites usar strftime y monkey con algunas cadenas de estilo C. Puede obtener la marca de tiempo UNIX de un NSDateuso NSDate -timeIntervalSince1970.

pix0r
fuente
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
fuente
3

Solo agrega esta extensión:

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

Si estás en Mac OS X puedes escribir:

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

Sin embargo, esto no está disponible en iOS.

neoneye
fuente
1

respuesta 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
fuente
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
fuente
0

Defina su propia utilidad para formatear la fecha requerida.

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

Es un 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
fuente