gpt4 book ai didi

swift - 我如何 "combine"一个未分区的日期和时区?

转载 作者:可可西里 更新时间:2023-11-01 02:01:45 28 4
gpt4 key购买 nike

我的问题与Get "time with time zone" from "time without time zone" and the time zone name 非常相似(我认为)。我只想在 Swift 中完成。

无论如何,我正在尝试编写一个具有以下签名的函数:

func combine(_ date: Date, with timeZone: TimeZone) -> Date?

它的作用是基本上接受一个日期并返回一个“分区”日期。如果日期在时区中不存在,则返回 nil

为避免成为 XY 问题,这里是屏幕截图:

enter image description here

我要求用户提供日期和时区,我想将这两者合并为一个 Date

我会尽力解释。我将以 timeIntervalFrom1970 的格式表示日期,以使其尽可能清晰。

假设我传入 0 作为日期和 GMT-1 作为时区,它将返回 3600。0 是 1970-1-1 00:00:00。 1970-1-1 00:00:00 in GMT-1 在 GMT 中是 1970-1-1 01:00:00,即 3600。

这就是我尝试实现的方式:

return date.addingTimeInterval(-timeZone.secondsFromGMT(for: date))

这似乎最有效,但并非所有时间。但是,如果涉及 DST 并且整个事情变得困惑,我认为它不会返回正确的结果。它也感觉“数学式”。我更喜欢没有数学的方法,只使用 Foundation API 方法。

那么,我该如何实现这个方法呢?

最佳答案

在您的示例中,API 为您提供了一个Date,但您想要解释在某个给定的时区,它是“2017/08/18 8:08”。假如说eureka 表单 UI 元素使用当前日历的时区为了显示,您可以将日期转换为DateComponents,然后返回到具有不同时区的 Date

func combine(_ date: Date, with timeZone: TimeZone) -> Date? {
var cal = Calendar.current
let comp = cal.dateComponents([.era, .year, .month, .day, .hour, .minute, .second], from: date)
cal.timeZone = timeZone
return cal.date(from: comp)
}

nil 如果日期/时间组合不存在则返回在另一个时区。

关于swift - 我如何 "combine"一个未分区的日期和时区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45751109/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com