Swift:使用strftime和localtime进行NSDate格式化

ma1*_*w28 10 c objective-c strftime localtime swift

如何将以下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
Run Code Online (Sandbox Code Playgroud)

我正在格式化date.

Gri*_*mxn 46

正如评论员@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())
Run Code Online (Sandbox Code Playgroud)

"数据格式指南"中提供了格式字符串的完整说明 .

  • 日期格式符号:[ICU格式化日期和时间](http://userguide.icu-project.org/formatparse/datetime) (2认同)
  • 抱歉,这是如何使用 strformat 的?OP 明确要求这个,而不是这个解决方案。 (2认同)

ma1*_*w28 -1

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

  • @joan @zaph 说实话,经过一些修改,这将是一种可行的方法,也是对性能更关键的场景的有效替代方案。“NSDateFormatter”是出了名的慢,当性能至关重要时,我们需要管理缓存的格式化程序 - 或者我们可能对这种方法感到满意。 (6认同)
  • 不要这样做!Swift 的一个要点是摆脱“C”和显式指针,转向更安全的语言。这里我们不仅有“C”语法,而且有可能在未来的代码更改中溢出“buffer”。从安全角度来看,这甚至不是可接受的“C”代码。 (3认同)