将格式为“yyyy-MM-dd HH:mm:ss.m”的日期字符串转换为“yyyy-MM-dd HH:mm:ss”时出现问题

Posted

技术标签:

【中文标题】将格式为“yyyy-MM-dd HH:mm:ss.m”的日期字符串转换为“yyyy-MM-dd HH:mm:ss”时出现问题【英文标题】:Issue when converting a date string of format "yyyy-MM-dd HH:mm:ss.m" to "yyyy-MM-dd HH:mm:ss" 【发布时间】:2020-05-01 07:24:24 【问题描述】:

我正在 swift 5 中开发一个 ios 项目。在我的一个 API 中,日期的格式为“yyyy-MM-dd HH:mm:ss.m”。从这个日期开始,我需要获取时间。但问题是,假设我从 API 获得的日期是“1900-01-01 08:30:00.000000”,当我将此日期格式转换为 YYYY-MM-dd HH:mm:ss 时,结果是以“1900-01-01 08:00:00”的形式出现,转换前的时间为 08:30:00.000000,但转换后的时间为 08:00:00。为什么会这样?请帮我。

我将在这里添加我的代码,

    let dateTime = "1900-01-01 08:30:00.000000"
    let outFormatter = DateFormatter()
    outFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss.m"

    if let date = outFormatter.date(from: dateTime)  
        //here value od date is 1900-01-01 04:18:48 +0000
        outFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        outFormatter.locale = tempLocale
        let exactDate = outFormatter.string(from: date)
        //here the value of exactDate is 1900-01-01 08:00:00
    

【问题讨论】:

【参考方案1】:

m 是分钟,S 是毫秒,所以格式必须是 "yyyy-MM-dd HH:mm:ss.S"

对于固定日期格式,强烈建议将语言环境设置为en_US_POSIX

let dateTime = "1900-01-01 08:30:00.000000"
let outFormatter = DateFormatter()
outFormatter.locale = Locale(identifier: "en_US_POSIX")
outFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss.S"

if let date = outFormatter.date(from: dateTime) 
    //here value od date is 1900-01-01 04:18:48 +0000
    outFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"

    let exactDate = outFormatter.string(from: date)
    //here the value of exactDate is 1900-01-01 08:00:00

但是如果你只想从日期字符串中去掉毫秒,那么有一个更简单的解决方案

let dateTime = "1900-01-01 08:30:00.000000"
let exactDate = dateTime.replacingOccurrences(of: "\\.\\d+", with: "", options: .regularExpression)

它会删除点和后面的任何数字

【讨论】:

以上是关于将格式为“yyyy-MM-dd HH:mm:ss.m”的日期字符串转换为“yyyy-MM-dd HH:mm:ss”时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

Java 格式 yyyy-MM-dd'T'HH:mm:ss.SSSz 转 yyyy-mm-dd HH:mm:ss

如何将日期时间从 PowerShell 输出转换为 yyyy-MM-dd HH:mm:ss 格式

将这种“ yyyy-MM-dd'T'HH:mm:ss.SSSXXX”格式的字符串转换为LocalDate

格式为“yyyy-mm-dd HH:mm:ss”的 Java 字符串到日期对象

Oracle 中的时间戳转换为 YYYY-MM-DD HH:MM:SS 格式

js中怎么将yyyy-MM-dd hh:mm:ss格式的转换为date类型