Форматирование 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?
Dimme

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дата и время возврата

Для получения дополнительной информации Формат данных и времени для Click Now.

Спасибо.....


1
Пожалуйста, предоставьте дополнительное описание вместе с образцом кода.
Maciej Lach

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

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

Поиграйте с шаблоном, чтобы он соответствовал вашим потребностям. Примеры и док здесь , чтобы помочь вам создать нужный шаблон.

Заметка

Вы можете захотеть кэшировать свой, 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.