【问题标题】:How to add days to date如何添加日期
【发布时间】:2021-08-01 15:24:27
【问题描述】:

我想得到第二天@给定日期的午夜。 到目前为止,我正在使用:

givenDate.Add(time.Hour * time.Duration(24))

问题在于如果我添加 24 小时,我会在同一天停留在某些时区。在法国,他们不时改变时间。

使用以下添加一天是否安全?

time.Date(givenDate.Year(), givenDate.Month(), givenDate.Day()+1, 0, 0, 0, 0, loc)

loc 在给定示例中为 time.UTC。

【问题讨论】:

  • 你能比“它安全吗”更具体一些吗?您对这种方法有什么疑问?你测试过吗?
  • 我认为您需要考虑的唯一边缘情况是,有些时间实际上从未发生过,有些时间发生了两次(夏令时轮班时间为 1 小时)。据我所知,所有转换的语言都在凌晨 2 点这样做,所以如果你只是对午夜感兴趣,那么这应该不是问题。
  • 很高兴了解凌晨 2 点的经验法则。 @HymnsForDisco 是的,我可以澄清一下。我想知道使用 time.Date(2020, 10, 40) 创建日期是否是一种可靠的创建日期的方法,例如,该月的所有额外天数仍将添加到日期中。我做了一些测试,它似乎适用于我的用例。

标签: date go


【解决方案1】:

您提出的解决方案是“安全”且良好的:

t2 := time.Date(givenDate.Year(), givenDate.Month(), givenDate.Day()+1, 0, 0, 0, 0, loc)

您可以通过以下方式使其更快:

y, m, d := givenDate.Date()
t2 := time.Date(y, m, d+1, 0, 0, 0, 0, loc)

由于Time.Date() 在一次调用中返回日期组件,如果您检查实现,Time.Year()Time.Month()Time.Day() 方法都在后台调用相同的 Time.date()(未导出)方法(在你的情况下是 3 次),就像 Time.Date()

time.Date() 文件表明:

日期返回时间对应

yyyy-mm-dd hh:mm:ss + nsec nanoseconds

在当时的适当区域在给定位置

因此,文档说明该位置已被考虑在内,如果您将 0 传递给小时、分钟、秒、纳秒,则 在给定区域中将是 0。

【讨论】:

    猜你喜欢
    • 2010-10-08
    • 2014-01-26
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多