如何“组合”未分区的日期和时区?

时间:2017-08-18 07:39:50

标签: swift date timezone

我的问题与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。 GMT-1的1970-1-1 00:00:00是GMT的1970-1-1 01:00:00,即3600。

这就是我试图实现这个的方法:

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

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

那么,如何实施此方法?

1 个答案:

答案 0 :(得分:1)

在您的示例中,API会为您提供using System.ComponentModel; using System.Windows.Forms; using System.Windows.Forms.Design; [ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability.ContextMenuStrip)] public class ToolStripTreeView : ToolStripControlHost { [DesignerSerializationVisibility( DesignerSerializationVisibility.Content)] public TreeView TreeViewControl { get { return (TreeView)Control; } } public ToolStripTreeView() : base(CreateControl()) { } private static TreeView CreateControl() { var t = new TreeView(); return t; } } ,但您想解释 在某个特定时区内的“2017/08/18 8:08”。假如说 eureka表单UI元素使用当前日历的时区 要显示,您可以将日期转换为Date,然后再返回 到具有不同时区的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) } 在另一个时区。