Swift: форматирование NSDate с помощью strftime и localtime

Как преобразовать следующий код Objective-C в код Swift?

#define MAX_SIZE 11
char buffer[MAX_SIZE];
time_t time = [[NSDate date] timeIntervalSince1970];
strftime(buffer, MAX_SIZE, "%-l:%M\u2008%p", localtime(&time));
NSString *dateString = [NSString stringWithUTF8String:buffer];
NSLog(@"dateString: %@", dateString); // dateString: 11:56 PM

Я форматирую date.


person ma11hew28    schedule 17.06.2014    source источник
comment
используйте 1_   -  person Bryan Chen    schedule 17.06.2014
comment
Я бы просто использовал NSDateFormatter вместо strftime(3)   -  person Jason Coco    schedule 17.06.2014
comment
Пошаговое указание людям сделать что-то, что не отвечает на вопрос. Есть несколько веских причин не использовать NSDateFormatter, и вы, не отвечая на ОП, не помогает ни ему, ни кому-либо еще, кто ищет то же самое. Так устал искать использование NSDateFormatter, когда пытаюсь найти strftime. Вздох.   -  person Gargoyle    schedule 24.12.2015


Ответы (4)


Как сказали комментаторы @BryanChen и @JasonCoco, используйте NSDateFormatter.

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd 'at' h:mm a" // superset of OP's format
let str = dateFormatter.stringFromDate(NSDate())

Полное описание строк формата доступно в "Руководство по форматированию данных".

person Grimxn    schedule 17.06.2014
comment
Символы форматирования даты: Формат даты и времени ICU - person zaph; 17.06.2014
comment
Извините, но как это с использованием strformat? ОП явно просит об этом, а не об этом решении. - person Mathijs Segers; 19.06.2015
comment
Прочтите комментарии @zaph ниже во время этого вопроса и ответа. strformat по своей сути небезопасен, и этот код производит тот же результат, что и OP, запрошенный с использованием безопасных конструкций Swift. - person Grimxn; 19.06.2015
comment
@Grimxn @Unome, это не правильный ответ. NSDateFormatter может сильно снижать производительность при синтаксическом анализе большого количества дат, и, вероятно, поэтому исходный код не использует его. Это не ответ на вопрос. - person Jordan Smith; 06.07.2016
comment
@Jordan, отрицательно комментировать ответы людей, чтобы продвигать свои собственные, - это BM. Этот код очень прост и полезен для сценариев, в которых вам не нужно анализировать много дат. ДЛЯ сценариев, которые требуют синтаксического анализа большого количества дат, я согласен с тем, что ваше решение более низкого уровня лучше за счет удобочитаемости и сложности. Ни один из ответов не написан или неверен. И выбранный ОП не выбрал правильный ответ. Я удалю свой комментарий «Принять этот ответ», так как в этом посте полезно несколько ответов. - person Unome; 03.08.2016
comment
@Unome не пытается продвигать свой собственный ответ, извините, мне все равно, сколько голосов получит мой ответ. Комментарий должен был соответствовать приведенному выше комментарию Матджиса Сегерса: вопрос задавался, как преобразовать код, а не как сделать что-то по-другому. Это все равно, что спросить, как сказать что-то по-испански, и получить ответ, что большинство людей все равно говорят по-английски, а ответа по-испански не дано. - person Jordan Smith; 04.08.2016

Вот еще один пример, в котором используется NSDateFormatterStyle:

private func FormatDate(date:NSDate) -> String {
  let dateFormatter = NSDateFormatter()
  dateFormatter.dateStyle = NSDateFormatterStyle.LongStyle
  return dateFormatter.stringFromDate(date)
}

Выходной формат имеет следующий формат: «1 января 1990 г.».

Если вы хотите узнать больше о средстве форматирования и различных доступных стилях, ознакомьтесь с NSFormatter в разделе NSDateFormatter< /em> раздел.

person Zorayr    schedule 13.05.2015

Моя функция, которую я использую.

extension NSDate {
    public func toString (format: String) -> String {
        let formatter = NSDateFormatter ()
        formatter.locale = NSLocale.currentLocale()
        formatter.dateFormat = format

        return formatter.stringFromDate(self)
    }
}
date.toString("yyyy-MM-dd")
person YannSteph    schedule 18.03.2016

person    schedule
comment
НЕ ДЕЛАЙТЕ ЭТОГО! Одна из целей Swift — уйти от C и явных указателей на более безопасный язык. Здесь у нас есть не только синтаксис C, но и возможность превзойти buffer с будущим изменением кода. Это неприемлемый код C даже с точки зрения безопасности. - person zaph; 17.06.2014
comment
@joan @zaph Честно говоря, с некоторыми изменениями это был бы жизнеспособный подход и достойная альтернатива для более критичного к производительности сценария. NSDateFormatter общеизвестно медленный, и когда производительность критична, нам нужно управлять кэшированным средством форматирования - или мы можем быть довольны этим подходом. - person CouchDeveloper; 01.01.2015
comment
Я не понимаю, почему за другие вещи проголосовали, а за это проголосовали против, это единственный реальный ответ на вопрос ОП, а также, конечно, его собственный ответ. Но если вы хотите использовать строку strformat, вам нужно использовать что-то вроде этого, NSformatter не будет его поддерживать. - person Mathijs Segers; 19.06.2015