在Swift中将任何时间转换为GMT +3

时间:2017-10-28 20:15:42

标签: swift date time timezone nsdate

我想转换任何时间,UTC,GMT + 2等等,任何事情都只有GMT +3

我试过这段代码但没有成功

        let date = Date()
        let formatter = DateFormatter()

        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss Z"
        formatter.timeZone = TimeZone.current

       let currentdate = formatter.string(from: date)

        print("currentdate \(currentdate)")


        let gmt = DateFormatter()
        gmt.timeZone = TimeZone(secondsFromGMT: 3600*3)
        gmt.dateFormat = "yyyy-MM-dd HH:mm:ss Z"
        let gmtDate = gmt.date(from: currentdate)!

        print("gmtDate -> \(gmtDate)")

我尝试了时区的缩写,同样的结果是日期只是GMT。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

您的代码存在很多问题。首先,没有理由从Date转到String并返回Date。其次,如果您要将String转换为Date,并且String包含自己的时区信息,则设置格式化程序timeZone毫无意义。计算关联的Date时,将使用字符串中的时区。只有两种情况可以设置日期格式化程序的时区:

  1. 解析不包含任何时区信息的日期/时间字符串时。格式化程序的时区将用于解释字符串。
  2. Date转换为String时。从日期生成结果字符串时,将使用格式化程序的时区。
  3. 如果您只想在特定时区内将Date显示为String,那么您只需要:

    let date = Date() // some date
    print("Original Date (in GMT): \(date)")
    
    // Setup a formatter with a date and time style
    let formatter = DateFormatter()
    formatter.timeZone = TimeZone(secondsFromGMT: 3600 * 3) // the desired timezone
    formatter.dateStyle = .long
    formatter.timeStyle = .medium
    let string = formatter.string(from: date)
    print("GMT+3 style result: \(string)")
    
    // For comparison, set the formatter to a specific format
    formatter.dateFormat = "yyyy-MM-dd HH:mm:ss Z"
    let string2 = formatter.string(from: date)
    print("GMT+3 format result: \(string2)")
    

    输出(对于en_US语言环境):

      

    原始日期(格林威治标准时间):2017-10-28 20:53:59 +0000
      GMT + 3风格结果:2017年10月28日下午11:53:59
      GMT + 3格式结果:2017-10-28 23:53:59 +0300

    无需随时转换。只需从String创建Date即可获得所需的输出。

    请注意,默认情况下,DateFormatter会以当地时间显示其结果。如果您希望将结果放在其他特定时区,请设置格式化程序timeZone

    另请注意,打印Date对象始终以UTC时间(+0000)显示日期。许多人对此感到困惑,并认为他们错误的日期不是。

答案 1 :(得分:1)

雨燕5

private func convertDate(string:String) -> String {
        let dateFormatter = DateFormatter()
        // format in which the date and time comes from the server
        dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
         // set the time zone, the time is stored on the server
        dateFormatter.timeZone = TimeZone(abbreviation: "GMT+3")
        // convert to Date
        let date = dateFormatter.date(from: string)

        // now set our local time zone
        dateFormatter.timeZone = TimeZone.current
        // time format we need
        dateFormatter.dateFormat = "dd.MM.yyyy HH:mm"
        // convert the Date obtained above into text format
        let displayString = dateFormatter.string(from: date!)
        // local time is ready)))
        return displayString
    }