英文:
How to compare two time instants in an accurate way?
问题
我有两个时间实例。have 是我从数据库中获取的时间,Now() 是当前时间。当我使用 After 来比较它们时,结果并不是我期望的那样。这两个实例如下所示:
// have => 2022-01-09 09:09:59 +0000 +0000
// now => 2022-01-09 11:57:08.990265878 +0300 +0300 m=+4.977355713
if now.After(have) {
// ...
}
我期望上述条件返回 true,但实际上返回的是 false。为了更好地理解问题,我使用 Unix() 将它们转换为 Unix 时间,令人惊讶的是,have 的值稍微大于 now,这就是条件返回 false 的原因。
显然,now 在 have 之后,但它的 Unix 时间却小于 have。
由于我对这个情况感到困惑,你能告诉我我错在哪里吗?
更新
问题出在时区上。
我没有注意到这一点。所以我添加了以下代码:
loc, _ := time.LoadLocation("Local")
have = have.In(loc)
然后,一旦我打印出来,它就是这样的:
have => 2022-01-09 12:09:59 +0300 +0300
这就是条件返回 false 的原因。
英文:
I have two time instances. have which I fetch from a database and Now() time. Once I want to compare them using After, the result is not the one which I expected. The instances are as follow:
// have => 2022-01-09 09:09:59 +0000 +0000
// now => 2022-01-09 11:57:08.990265878 +0300 +0300 m=+4.977355713
if now.After(have) {
// ...
}
I expected the true result from the above condition, while it returns false. To figure it out better, I converted them to Unix time with Unix() and surprisingly the value of have was slightly greater than now and that is why the condition returns false.
Obviously now is after have but its Unix time is less than have.
As I am wondering regarding the case, would you please let me know where am I wrong?
Update
The problem was about time zones.
I have not noticed about it. So I added the following code:
loc, _ := time.LoadLocation("Local")
have = have.In(loc)
and then once I printed it out, it was like this:
have => 2022-01-09 12:09:59 +0300 +0300
That is why the condition was returning false.
答案1
得分: 1
两个时间处于不同的时区:have 是在 UTC 时区,而 now 是在 +0300 时区。因此,在将 now 的日期/时间部分与另一个时间进行比较之前,你需要从 now 的值中减去 3 小时。
英文:
The two times are in different timezones: have is in UTC, and now is in +0300. Thus you have to subtract 3 hours from the date/time part of the now value before comparing it to the other time.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论