如何使用strftime在Swift中格式化字符串

4

EDIT: 请仔细阅读,我需要支持这个特定的格式,我不能只使用NSDateFormatter进行硬编码格式

嗨,我有一个任务,需要使用从我们的API检索到的设置来格式化应用程序中的所有日期,此格式在此情况下由strftime函数支持。

我该如何在Swift中使用它们?

日期和时间的示例格式: "date_format": "%d %B %Y" "time_format": "%H:%M"

我找到了strtime函数,但我不确定应该如何使用它,甚至是否应该使用。我也只找到了Objective-C的示例。


2
为什么不直接使用 NSDateFormatter?它在苹果的“日期和时间编程指南”中有详细说明,并且您会在这里找到许多关于NSDateFormatter的问答(甚至包括Swift :))。 - Martin R
由于该问题特别要求符合NSDateFormatter不支持的格式? - Mathijs Segers
1
你究竟无法用NSDateFormatter实现哪些功能呢?"%d"代表的是"dd", "%B"代表的是"MMMM","%Y"代表的是"yyyy"等等……或者你是指strftime()格式是通过API检索的吗? - Martin R
是的,我把“the”改成了“我们的”以使其更清晰。 - Mathijs Segers
2个回答

3
我希望您能找到更好的方法来满足这个需求,但是这里提供代码。
let bufferSize = 255
var buffer = [Int8](count: bufferSize, repeatedValue: 0)
var timeValue = time(nil)
let tmValue = localtime(&timeValue)

strftime(&buffer, UInt(bufferSize), "%d %B %Y", tmValue)
let dateFormat = String(CString: buffer, encoding: NSUTF8StringEncoding)!

strftime(&buffer, UInt(bufferSize), "%H:%M", tmValue)
let timeFormat = String(CString: buffer, encoding: NSUTF8StringEncoding)!

注:我稍微更新了代码以提高其清晰度。

我更愿意使用本地格式,因为这更有意义,但有时候需求就是需求。谢谢分享。 - Mathijs Segers
我实际上得到了一个错误:"无法使用类型为(inout[(int8], UInt, String UnsafeMutablePointer<tm>的参数列表调用strftime",出现在这些strftime行上。 - Mathijs Segers
1
这段代码在Swift 1.2中无法编译通过:UInt(bufferSize) 应该改为 bufferSize。将char缓冲区转换为Swift字符串可以简化为 let dateFormat = String.fromCString(buffer)! - Martin R

1

如果我使用基于strftime的自定义格式,我就无法走得太远,对吗?我特别询问这个问题是因为我知道NSDateFormatter并一直在使用它。 - Mathijs Segers
抱歉..之前问题中没有提到那件事。 - Himanshu gupta
编辑并没有改变,格式也没有变化,我只是加粗了文本,因为人们往往不会阅读这些内容。 - Mathijs Segers

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