我怎样才能像在php中那样在Swift中格式化一个日期字符串?

xmq68pz9  于 2023-01-16  发布在  Swift
关注(0)|答案(1)|浏览(125)

我正在尝试格式化一个日期字符串,该字符串来自一个API,该API提供了以下格式的时间戳(例如):1970-01-01T12:30:00.000000Z.
我想以这种格式显示日期:1st January 1970.
在PHP中我可以这样写:

dateString = date( 'jS F Y', strtotime( $myUnformattedTimestamp ) );

如何在Swift中实现这一点?
我做了一些强制性的谷歌搜索,从另一个SO问题中找到了这个答案,但它没有帮助,因为它不适用于我的情况(可以说,更广泛)。

下面是答案中的代码:

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MM/dd/yyyy"
let date = dateFormatter.date(from: date)
dateFormatter.dateFormat = "yyyy-MM-dd"
let resultString = dateFormatter.string(from: date!)
print(resultString)

我试着用我的变量替换date变量,但我得到了各种各样的错误,并且对Xcode告诉我的内容感到困惑。
我使用Swift才2个月,所以我还不太清楚它是如何处理日期和时间的。我怎样才能像php那样简单地将时间戳格式化成各种格式呢?

编辑

我从@udi answer中提取了一些代码,至少在一个没有st,nd,rd,th后缀的简单实现中做了第一遍,得到了以下代码:

let dateFormatterGet = DateFormatter()
        dateFormatterGet.dateFormat = "yyyy-MM-dd HH:mm:ss"

        let dateFormatterPrint = DateFormatter()
        dateFormatterPrint.dateFormat = "d MMM yyyy"

        if let date = dateFormatterPrint.date(from: created_at) {
            return dateFormatterPrint.string(from: date)
        } else {
           return "FAILED"
        }

这是我的模型中的值(如上所示):

created_at: 1970-01-01T12:30:00.000000Z

上面的代码一直返回FAILED。这是因为时间戳必须与时间戳的格式完全匹配吗?这是Swift正确转换它的要求吗?无论如何,我不知道为什么它仍然不工作。

编辑2

这是我的模型,其中包含我的时间戳。

struct Message: Codable, Identifiable {
    var id:Int = 0
    var user_id:Int = 0
    var author_id:Int = 0
    var message:String = ""
    var unread:Int = 1
    var created_at:String = ""
    var updated_at:String = ""
}

API以字符串形式返回created_atupdated_at时间戳,格式为YYYY-MM-DD HH:ii:ss,因此基本上是1970-01-01 12:30:00
在我的API请求中,它取回数据并将其格式化为:

let myMessage = try! JSONDecoder().decode(Message.self, from: data!)

那么,也许JSON解码器正在更改我的时间戳?

4ioopgfo

4ioopgfo1#

在我看来,您得到的日期是Internet日期的格式,因此我们可以使用ISO8601DateFormatter将字符串date转换为Date对象。

let formatter = ISO8601DateFormatter()
formatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds]

那么,我建议您不要创建自己的输出格式,而是使用一种预定义的格式,让用户的设置来确定它的格式,假设您希望在UI中显示此日期。

let outputFormatter = DateFormatter()
outputFormatter.dateStyle = .long
outputFormatter.locale = .current

示例

let input = "1970-01-01T12:30:00.000000Z"

if let date = formatter.date(from: input) {
    print(outputFormatter.string(from: date))
}

相关问题