Форматування NSDate у певні стилі для року, місяця, дня та години, хвилини, секунди


132

В основному мені потрібно отримати поточну дату та час окремо, відформатовані як:

2009-04-26 
11:06:54

Код, наведений нижче, з іншого питання на ту ж тему, генерує

зараз: | 2009-06-01 23:18:23 +0100 | 
dateString: | 01 червня 2009 р. 23: 18 | 
розібрано: | 2009-06-01 23:18:00 +0100 |

Це майже те, що я шукаю, але хочу розділити день і час.

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);

1
У такому випадку, коли ви витратили час, щоб виписати код, який ви закінчили, використовуючи для вирішення проблеми, я, мабуть, вставлю його (у даному випадку все нижче edit2) у відповідь, а не редагування до вашої публікації. Це не велика річ, але це полегшує пошук / переконання, що це рішення питання.
Лоуренс Джонстон

Відповіді:


72

Рядки формату iPhone складаються у форматі Unicode . За посиланням знаходиться таблиця з поясненням того, що означають усі букви вище, щоб ви могли створити свою власну.

І звичайно, не забудьте випустити формати дати, коли ви закінчите з ними. Наведений вище код витоку format, nowі inFormat.


Він протікає навіть при активованій ARC?
Дімме

19
Вищезгадане не матиме витоків під ARC (звичайно, ARC не був доступний у 2009 році, коли ми обговорювали це).
Роб Нап’є

194

ось що я використав:

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];

12

ви можете скористатися цим методом просто передати йому свою дату

-(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;
}

11
    NSDateFormatter *dateformat = [[NSDateFormatter alloc] init];
    [dateformat setDateFormat:@"Your Date Format"];

встановити формат повернення - це ....

yyyy-MM-dd2015-12-17дата повернення

yyyy-MMM-dd2015-Dec-17дата повернення

yy-MM-dd15-12-17дата повернення

dd-MM-yy17-12-15дата повернення

dd-MM-yyyy17-12-2015дата повернення

yyyy-MMM-dd HH:mm:ss2015-Dec-17 08:07:13дата та час повернення

yyyy-MMM-dd HH:mm2015-Dec-17 08:07дата та час повернення

Детальніше Формат даних та часу для " Клацніть зараз".

Дякую.....


1
Будь ласка, надайте додатковий опис разом із зразком коду.
Мацей Лах

У мене ця дата '2018-06-08T07: 30: 05.391Z' Я спробував 'yyyy-MM-dd'T'HH: mm: ss.000Z', але отримую нульове значення.
Прамод Тапанія

4

нічого нового, але все ж хочу поділитися своїм методом:

+(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;
}

3

Для швидкого

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

0

Швидкий 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)
    }
    
}

Використання

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

Грайте з шаблоном, щоб відповідати вашим потребам. Приклади та doc тут щоб допомогти вам створити потрібний вам шаблон.

Примітка

Ви можете захопити кеш DateFormatter якщо, наприклад, плануєте використовувати його TableView. Щоб дати ідею, цикл понад 1000 дат знадобився мені 0,5 сек за допомогою вищевказаної toString(template: String)функції, порівняно з 0,05 сек за допомогою myFormatter.string(from: Date).


Щоб зробити цю замітку сильнішою (оскільки це дуже важливо), ви можете переробити функцію, щоб взяти необов'язковий параметр із значенням за замовчуванням нового екземпляра. Я не знаю, чому ви зняли свою відповідальність, тому я виступаю за це.
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];

Ось це, ти отримав все, що хочеш.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.