Swift: 使用strftime和localtime格式化NSDate

10

我该如何将以下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

我正在格式化一个日期


4
使用NSDateFormatter - Bryan Chen
1
我会使用 NSDateFormatter 而不是 strftime(3) - Jason Coco
3
告诉别人做某件事情,却没有回答问题。有多个合理的原因不使用NSDateFormatter,你没有回答发帖者的问题也无助于寻找同样需求的其他人。当我想寻找strftime时,总是看到"使用NSDateFormatter",真是累死了,哎。 - Gargoyle
4个回答

45

正如评论者@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())

有关格式字符串的完整描述,请参阅“数据格式指南”


2
日期格式符号:ICU 格式化日期和时间 - zaph
2
抱歉,但这个使用了strformat吗?原帖明确要求这个,而不是这个解决方案。 - Mathijs Segers
1
阅读此问题和答案时,请查看@zaph的评论。strformat本质上是不安全的,而这段代码使用安全的Swift结构产生了与OP请求相同的输出。 - Grimxn
1
@Grimxn @Unome 这不是正确的答案。当解析许多日期时,NSDateFormatter 可能会极大地降低性能,这很可能是原始代码没有使用它的原因。这不是问题的答案。 - Jordan Smith
1
@Jordan,为了推销自己而对他人的答案发表负面评论是不好的。这段代码非常简单且适用于不需要解析许多日期的场景。对于需要解析大量日期的情况,我同意你的低级解决方案更好,但代价是可读性和复杂性。两种答案都没有对错之分。OP也没有选择任何一个作为正确答案。由于此帖中有多个有用的答案,我将删除我的“接受此答案”评论。 - Unome
1
@Unome,我不是在宣传自己的答案,抱歉,我不在乎我的答案得到多少赞。这条评论的目的是与Mathjis Segers上面的评论保持一致:问题是如何转换代码,而不是如何用另一种方式做某事。这就像问如何用西班牙语说某件事,然后被告知大多数人都讲英语 - 没有给出西班牙语的答案。 - Jordan Smith

1

这里是另一个使用 NSDateFormatterStyle 的示例:

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

输出格式为"1990年1月1日"。
如果您想了解更多关于格式化程序和不同可用样式的信息,请查看NSDateFormatter部分下的NSFormatter

0

我使用的函数。

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

-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

3
不要这样做!Swift语言的一个目标是摆脱“C”和显式指针,转向一种更安全的语言。在这里,我们不仅使用了“C”的语法,而且还有可能在未来代码更改时越界buffer。从安全角度来看,即使是“C”代码也不能接受。 - zaph
6
说实话,稍作修改后,这将成为一种可行的方法,也是更高性能情景下的有效替代方案。NSDateFormatter是出了名的慢,当性能至关重要时,我们需要管理一个缓存的格式化器 - 或者我们可以采用这种方法来提高性能。 - CouchDeveloper
1
我不明白为什么其他的东西被点赞而这个被踩了,这是唯一真正回答 OP 问题的答案,当然还有他自己的答案。但如果你想使用 strformat 字符串,你需要使用像这样的东西,NSformatter 不支持它。 - Mathijs Segers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接