英文:
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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论