我在比较日期时间时遇到了问题,涉及到数据库、Go和Unix版本。

huangapple go评论89阅读模式
英文:

I am having trouble with comparing datetimes, when there are DB, Go and Unix versions

问题

所以,基本上一个人有一个班次,有一个开始时间和持续时间,我需要知道还有多少分钟。

我从数据库中检索到一个标准的字符串(MySQL)作为班次的开始时间(例如,2022-01-01 09:00:00)。
我还检索到班次的小时数(例如,8小时)。
然后,我可以使用Go的Time.time确定当前时间,但这个格式是不同的。

请参考下面的代码,它更好地解释了问题,并提供了缺失的部分。

var shiftStartDB string // 例如 2022-01-01 09:00:00
var shiftStartUnix int // 例如,将开始时间转换为自纪元以来的分钟数
var offTimer int // 班次的小时数
var shiftEndDB string // 例如 2022-01-01 17:00:00
var shiftEndUnix int // 例如,将结束时间转换为自纪元以来的分钟数
var nowTime Time.time // Go中的当前时间
var nowUnix int // Go中当前时间转换为Unix时间
var templateID string
var minsToGo int

_ = db.QueryRow("SELECT LastSignedOn, OffTimer, TemplateID FROM assets WHERE ID = ?", assetid).Scan(&shiftStartDB, &offTimer, &templateID)
shiftStartUnix = <将数据库时间转换为Unix时间>
if offTimerTemp == 0 {
    _ = db.QueryRow("OffTimer FROM templates WHERE ID = ?", templateID).Scan(&offTimer)
}
shiftEndUnix = shiftStartUnix + (offTimer * 60)
nowTime = time.Now()
nowUnix = <将Go时间转换为Unix时间>
minsToGo = shiftEndInt - nowInt
英文:

So, basically a person has a shift, with a start time and duration, and I need to know how many minutes to go.

I retrieve a standard string from the database (MySQL) of datetime for the start of the shift (for example, 2022-01-01 09:00:00).
I also retrieve the number of hours of the shift (for example, 8).
I can then determine current time, using Go's Time.time, but this format is different.

Please see code below, which explains the problem better, and gives the pieces missing.

var shiftStartDB string // For example 2022-01-01 09:00:00
var shiftStartUnix int // For example, start time converted to minutes since epoch
var offTimer int // Number of hours for the shift
var shiftEndDB string // For example 2022-01-01 17:00:00
var shiftEndUnix int // For example, end time converted to minutes since epoch
var nowTime Time.time // Go&#39;s version of time for now
var nowUnix int // Go has now converted to Unix time
var templateID string
var minsToGo int

_ = db.QueryRow(&quot;SELECT LastSignedOn, OffTimer, TemplateID FROM assets WHERE ID = ?&quot;, assetid).Scan(&amp;shiftStartDB, &amp;offTimer, &amp;templateID)
shiftStartUnix = &lt;convert database time into unix time&gt;
if offTimerTemp == 0 {
    _ = db.QueryRow(&quot;OffTimer FROM templates WHERE ID = ?&quot;, templateID).Scan(&amp;offTimer)
}
shiftEndUnix = shiftStartUnix + (offTimer * 60)
nowTime = time.Now()
nowUnix = &lt;convert Go time into Unix time&gt;
minsToGo = shiftEndInt - nowInt

答案1

得分: 1

你可以使用nowUnix = nowTime.UNIX()/60,因为Time.UNIX返回自纪元以来经过的秒数。也就是说,如果你解析了时间并直接使用Go库中的时间函数,处理起来可能更容易:

shiftStartTime,err := time.Parse("2006-02-01 15:04:05",dbTime)
shiftEnd=shiftStartTime.Add(time.Hour*offTimer)
minsToGo:=shiftEnd.Sub(time.Now()).Minutes()
英文:

You can use nowUnix = nowTime.UNIX()/60, as Time.UNIX returns the number of seconds elapsed since epoch. That said, this might be easier to deal with if you parsed the times and used go library time functions directly:

shiftStartTime,err := time.Parse(&quot;2006-02-01 15:04:05&quot;,dbTime)
shiftEnd=shiftStartTime.Add(time.Hour*offTimer)
minsToGo:=shiftEnd.Sub(time.Now()).Minutes()

huangapple
  • 本文由 发表于 2022年9月25日 23:51:00
  • 转载请务必保留本文链接:https://go.coder-hub.com/73845862.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定