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.

Ответ 1

    let maxSize: UInt = 11
    var buffer: CChar[] = CChar[](count: Int(maxSize), repeatedValue: 0)
    var time: time_t = Int(NSDate().timeIntervalSince1970)
    var length = strftime(&buffer, maxSize, "%-l:%M\u2008%p", localtime(&time))
    var dateString = NSString(bytes: buffer, length: Int(length), encoding: NSUTF8StringEncoding)
    NSLog("dateString: %@", dateString) // dateString: 11:56 PM

Ответ 2

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

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

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

Ответ 3

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

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

Результат форматируется как " 1 января 1990 года".

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

Ответ 4

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

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

Ответ 5

Аналогичный пример преобразования строки ISO 8601 в класс Swift Date:

extension Date
{        
    init(iso8601: String) {
        var t = tm()
        var cstr = iso8601.cString(using: .utf8)!
        strptime(&cstr, "%Y-%m-%dT%H:%M:%S%z", &t)
        t.tm_isdst = -1
        self = Date(timeIntervalSince1970: TimeInterval(mktime(&t)))
    }
}

Сделано это из-за высокой производительности!