当前位置: 首页 > 面试题库 >

Swift 3.0:将服务器UTC时间转换为本地时间,反之亦然

刘子实
2023-03-14
问题内容

我想将服务器UTC时间转换为本地时间,反之亦然。这是我的代码。

var isTimeFromServer = true
var time:String!
var period:String!
let timeString = "6:59 AM" //Current UTC time

if isTimeFromServer {

    let index = timeString.index(timeString.startIndex, offsetBy: 5)
    let twelve = timeString.substring(to: index)

    var dateString:String!

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "H:mm"
    let date12 = dateFormatter.date(from: twelve)!

    dateFormatter.dateFormat = "h:mm a"
    let date22 = dateFormatter.string(from: date12)

    //print(date22)
    dateString = date22
    //print("dateString=\(dateString)")

    time = dateString.components(separatedBy: " ")[0]
    period = dateString.components(separatedBy: " ")[1]

}
else {
    time = timeString.components(separatedBy: " ")[0]
    period = timeString.components(separatedBy: " ")[1]
}

var hour = Int(time.components(separatedBy: ":")[0])

hour = period == "AM" ? hour : hour! + 12
let minute = Int(time.components(separatedBy: ":")[1])
let calender = NSCalendar.current
var datecomponent = DateComponents()
datecomponent.calendar = calender
datecomponent.hour = hour
datecomponent.minute = minute

if !isTimeFromServer {
    // local to UTC
    datecomponent.timeZone = TimeZone.current
}
else {
    datecomponent.timeZone = TimeZone(abbreviation: "UTC")
}

let date = datecomponent.date
let dateFormatter = DateFormatter()

if !isTimeFromServer {
    dateFormatter.dateFormat = "H:mm"
    dateFormatter.timeZone = TimeZone(abbreviation: "UTC")
    dateFormatter.string(from: date!)
}
else {
    //UTC to local
    dateFormatter.dateFormat = "h:mm a"
    dateFormatter.timeZone = TimeZone.current
    dateFormatter.string(from: date!)
}

我知道当地时间

o / p:“下午12:52”

但是实际的本地时间和输出时间相差23分钟。


问题答案:

我不知道您的代码有什么问题。
但是看起来有太多不必要的事情,就像您要设置日历,从字符串中获取某些元素一样。这是我的UTCToLocal和localToUTC函数的小版本。
但是为此,您需要以特定格式传递字符串。原因我已强制打开日期对象。但是您可以使用一些保护条件来防止应用程序崩溃。

func localToUTC(date:String) -> String {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "h:mm a"
    dateFormatter.calendar = NSCalendar.current
    dateFormatter.timeZone = TimeZone.current

    let dt = dateFormatter.date(from: date)
    dateFormatter.timeZone = TimeZone(abbreviation: "UTC")
    dateFormatter.dateFormat = "H:mm:ss"

    return dateFormatter.string(from: dt!)
}

func UTCToLocal(date:String) -> String {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "H:mm:ss"
    dateFormatter.timeZone = TimeZone(abbreviation: "UTC")

    let dt = dateFormatter.date(from: date)
    dateFormatter.timeZone = TimeZone.current
    dateFormatter.dateFormat = "h:mm a"

    return dateFormatter.string(from: dt!)
}

然后像下面这样调用这些函数。

print(UTCToLocal(date: "13:07:00"))
print(localToUTC(date: "06:40 PM"))

希望这会帮助你。
编码愉快!!



 类似资料:
  • 问题内容: 我正在使用Android应用程序,并且要将本地时间(设备时间)转换为UTC并将其保存在数据库中。从数据库中检索它之后,我必须再次将其转换并显示在设备的时区中。谁能建议如何用Java做到这一点? 问题答案: 我使用这两种方法将本地时间转换为GMT / UTC,反之亦然,这对我来说没有任何问题。 将要转换为设备本地时间的GMT / UTC日期传递给此方法:

  • 我正在开发Android应用程序,我想将本地时间(设备时间)转换为UTC,并将其保存在数据库中。从数据库中检索后,我必须再次将其转换并显示在设备的时区中。有人能建议如何在Java中做到这一点吗?

  • 我正在开发Android应用程序,我想将用户选择的本地时间(设备时间)转换为UTC秒。之后,我必须再次转换并显示在设备的时区中。有人能建议在科特林如何做到这一点吗?

  • 我想使用moment.js将本地时间转换为等价的UTC。我相信我已经有了正确的方法,但它不会改变时间。 我在悉尼,澳大利亚+11,预计协调世界时将早11个小时。 在moment对象内部,isUTC标志从false变为true,但时间没有改变,我是不是打算为此使用一种不同的技术。 转换后

  • 我有一个Unix历元时间戳(以毫秒为单位),需要获取本地时间的日期字符串。 这是我的代码: 由上述函数生成的原始时间戳和结果日期、小时和所有其他值均以UTC为单位。如何更改代码以在当地时间获取它?

  • 问题内容: 我有一个UTC时区,例如: 还有一个pytz时区对象: 转换为给定时区的正确方法是什么? 问题答案: 我想我明白了: 这行代码首先将朴素的(不了解时区的) 对象转换为包含时区(UTC)的对象。然后,它使用该功能根据请求的时区调整时间。