Formateando NSDate en estilos particulares para año, mes, día y hora, minuto, segundos

132

Básicamente, necesito obtener la fecha y hora actuales por separado, formateadas como:

2009-04-26 
11:06:54

El siguiente código, de otra pregunta sobre el mismo tema, genera

ahora: | 2009-06-01 23:18:23 +0100 | 
dateString: | 01 de junio de 2009 23:18 | 
analizado: | 2009-06-01 23:18:00 +0100 |

Esto es casi lo que estoy buscando, pero quiero separar el día y la 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
fuente
1
En un caso como este, donde te has tomado el tiempo de escribir el código que terminaste usando para resolver el problema, probablemente lo pegaría (en este caso, todo lo que está debajo de edit2) en una respuesta en lugar de editarlo en tu publicación. No es una gran cosa de ninguna manera, pero hace que sea un poco más fácil encontrar / ver que es una solución a la pregunta.
Lawrence Johnston

Respuestas:

72

Las cadenas de formato de iPhone están en formato Unicode . Detrás del enlace hay una tabla que explica lo que significan todas las letras anteriores para que pueda construir la suya.

Y, por supuesto, no olvide lanzar sus formateadores de fecha cuando haya terminado con ellos. El código anterior se filtra format, nowy inFormat.

Rob Napier
fuente
Se filtra incluso con ARC activado?
Dimme
19
Lo anterior no tendrá fugas bajo ARC (por supuesto, ARC no estaba disponible en 2009 cuando teníamos esta discusión).
Rob Napier
194

esto es lo que usé:

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
fuente
12

puedes usar este método solo pasa tu fecha

-(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;
}
gurú
fuente
11
    NSDateFormatter *dateformat = [[NSDateFormatter alloc] init];
    [dateformat setDateFormat:@"Your Date Format"];

establecer el formato para devolver es ...

yyyy-MM-dd2015-12-17fecha de regreso

yyyy-MMM-dd2015-Dec-17fecha de regreso

yy-MM-dd15-12-17fecha de regreso

dd-MM-yy17-12-15fecha de regreso

dd-MM-yyyy17-12-2015fecha de regreso

yyyy-MMM-dd HH:mm:ss2015-Dec-17 08:07:13fecha y hora de regreso

yyyy-MMM-dd HH:mm2015-Dec-17 08:07fecha y hora de regreso

Para obtener más información, datos y formato de hora, haga clic ahora.

Gracias.....

PT Vyas
fuente
1
Proporcione una descripción adicional junto con el ejemplo de código.
Maciej Lach
Tengo esta fecha '2018-06-08T07: 30: 05.391Z' he intentado 'aaaa-MM-dd'T'HH: mm: ss.000Z' pero obtengo un valor nulo.
Pramod Tapaniya
4

nada nuevo pero aún quiero compartir mi 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
fuente
3

Para rápido

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

fuente
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

Juega con la plantilla para satisfacer tus necesidades. Ejemplos y documentos aquí para ayudarlo a crear la plantilla que necesita.

Nota

Es posible que desee almacenar en caché su DateFormattersi planea usarlo, TableViewpor ejemplo. Para dar una idea, recorrer más de 1000 fechas me llevó 0.5 segundos usando la toString(template: String)función anterior , en comparación con 0.05 segundos usando myFormatter.string(from: Date).

frouo
fuente
Para fortalecer esa nota (porque es muy importante), puede refactorizar su función para tomar un parámetro opcional con un valor predeterminado de la nueva instancia. No sé por qué te votaron negativamente, así que lo estoy votando.
Vive el
-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];

Eso es todo, lo tienes todo lo que quieres.

Nikesh K
fuente