Formatowanie NSDate na określone style dla roku, miesiąca, dnia i godziny, minuty i sekundy

132

Zasadniczo muszę osobno pobrać aktualną datę i godzinę w formacie:

2009-04-26 
11:06:54

Generuje się poniższy kod z innego pytania na ten sam temat

teraz: | 2009-06-01 23:18:23 +0100 | 
dateString: | Jun 01, 2009 23:18 | 
przeanalizowano: | 2009-06-01 23:18:00 +0100 |

To jest prawie to, czego szukam, ale chcę oddzielić dzień i godzinę.

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
źródło
1
W takim przypadku, w którym poświęciłeś trochę czasu na napisanie kodu, którego użyłeś do rozwiązania problemu, prawdopodobnie umieściłbym go (w tym przypadku wszystko poniżej edit2) w odpowiedzi, a nie w edycji twojego postu. W każdym razie nie jest to wielka rzecz, ale trochę łatwiej jest znaleźć / zobaczyć, że jest to odpowiedź na pytanie.
Lawrence Johnston

Odpowiedzi:

72

Ciągi formatu iPhone są w formacie Unicode . Za linkiem znajduje się tabela wyjaśniająca znaczenie wszystkich powyższych liter, dzięki czemu możesz zbudować własne.

I oczywiście nie zapomnij zwolnić formatek daty, kiedy skończysz z nimi. Powyższy kod przecieka format, nowi inFormat.

Rob Napier
źródło
Wycieka nawet przy aktywnym ARC?
Dimme
19
Powyższe nie będzie miało żadnych przecieków pod ARC (oczywiście ARC nie był dostępny w 2009 roku, kiedy prowadziliśmy tę dyskusję).
Rob Napier
194

to jest to, czego użyłem:

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
źródło
12

możesz użyć tej metody, po prostu podaj jej datę

-(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
źródło
11
    NSDateFormatter *dateformat = [[NSDateFormatter alloc] init];
    [dateformat setDateFormat:@"Your Date Format"];

ustaw format do zwrotu to ....

yyyy-MM-dd2015-12-17data powrotu

yyyy-MMM-dd2015-Dec-17data powrotu

yy-MM-dd15-12-17data powrotu

dd-MM-yy17-12-15data powrotu

dd-MM-yyyy17-12-2015data powrotu

yyyy-MMM-dd HH:mm:ss2015-Dec-17 08:07:13data i godzina powrotu

yyyy-MMM-dd HH:mm2015-Dec-17 08:07data i godzina powrotu

Aby uzyskać więcej informacji, Format danych i czasu dla Kliknij teraz.

Dziękuję Ci.....

PT Vyas
źródło
1
Proszę podać dodatkowy opis wraz z przykładem kodu.
Maciej Lach
Mam tę datę '2018-06-08T07: 30: 05.391Z' Próbowałem 'yyyy-MM-dd'T'HH: mm: ss.000Z', ale otrzymuję wartość zerową.
Pramod Tapaniya
4

nic nowego, ale nadal chcę udostępniać moją metodę:

+(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
źródło
3

Szybko

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

źródło
0

Szybki 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)
    }
    
}

Stosowanie

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

Pobaw się szablonem dopasowanym do Twoich potrzeb. Przykłady i doc tutaj , aby pomóc Ci zbudować szablon trzeba.

Uwaga

Możesz zechcieć zapisać swój plik w pamięci podręcznej, DateFormatterjeśli planujesz go TableViewna przykład użyć . Aby dać wyobrażenie, zapętlenie ponad 1000 dat zajęło mi 0,5 sekundy przy użyciu powyższej toString(template: String)funkcji, w porównaniu do 0,05 sekundy przy użyciu myFormatter.string(from: Date).

frouo
źródło
Aby uczynić tę notatkę silniejszą (ponieważ jest to bardzo ważne), możesz refaktoryzować swoją funkcję tak, aby pobierała opcjonalny parametr z domyślną wartością nowej instancji. Nie wiem, dlaczego zostałeś odrzucony, więc głosuję za tym.
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];

To wszystko, masz wszystko, co chcesz.

Nikesh K.
źródło