格式化日期字符串Swift 3中的问题

时间:2017-09-01 11:25:02

标签: ios swift nsdateformatter nstimezone

我需要将以下日期字符串转换为Swift 3中的日期。

Fri Dec 09 16:18:43 AMST 2016

这是我一直在使用的代码,但它在这个特定的日期字符串转换上获得了现金。 (此日期是使用new Date().toString()方法在Android上记录的。)

static func formatDate(date: String) -> String {
        let dateFormatter = DateFormatter()

        dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
        dateFormatter.dateFormat = "EEE MMM dd HH:mm:ss zzz yyyy" 
        //Works for "Fri Sep 16 10:55:48 GMT+05:30 2016"

        var myDate = dateFormatter.date(from: date)
        // My date returns nil on "Fri Dec 09 16:18:43 AMST 2016"

        dateFormatter.dateFormat = "dd/MM/yyyy"
        return "\(dateFormatter.string(from: myDate!))"
    }

数据库中有两种类型的字符串。我尝试了各种类型的时区格式(z / zz / zzz / zzzz / zzzzz)但始终myDate返回nil。

任何帮助将不胜感激。 在此先感谢。

1 个答案:

答案 0 :(得分:3)

TimeZone(abbreviation:)的Apple文档:

  

一般情况下,不鼓励使用缩写,但“GMT”等唯一实例除外。时区缩写不是标准化的,因此给定的缩写可能有多种含义。

AMST是代表“亚马逊夏令时”(UTC-3)还是“亚美尼亚夏令时”(UTC + 5)?请参阅:https://www.timeanddate.com/time/zones

这可能是为什么它无法检测到正确使用的时区。

我可以建议的解决方案:

  1. 如果你知道AMST是哪个时区:
    • 在日期字符串
    • 中用UTC-3或UTC + 5替换AMST
    • 从日期字符串中删除AMST并使用dateFormatter.timeZone = TimeZone(secondsFromGMT: -3 or 5 * 3600)
  2. 让您的源输出更精确的时区。
  3. 请注意以下代码,其中正确理解AMST:

    let df = DateFormatter()
    df.locale = Locale.init(identifier: "pt_BR") // assuming AMST is Amazon Summer Time (UTC -3)
    df.dateFormat = "HH:mm:ss z"
    
    print(df.date(from: "16:18:43 AMST")) // Optional(2000-01-01 19:18:43 +0000)
    

    但是,只要您包含英文日期或月份名称(例如,星期五或十二月),它就会生成nil(因为它们不是葡萄牙语)。