gpt4 book ai didi

时间格式化和从字符串转换

转载 作者:IT王子 更新时间:2023-10-29 01:55:13 26 4
gpt4 key购买 nike

我是 Go 的新手,主要从事 C# 工作。我目前正在研究将用作获取下一辆公共(public)汽车的命令的东西。目前它无法编译,因为我正在努力理解如何在 Go 中使用 time 包。

我有一个字符串数组,格式化为计划的时间,另一个格式化为像这样的常规服务的分钟(还有很多次,这些只是一个例子:

var ScheduledTimes = []string{"06:34", "06:54", "17:09", "17:19"}
var RegularTimes = []string{"05", "50"}

所以我目前正在做的是获取当前时间并检查它是否正常运行:

func isWithinRegularService(check time.Time) bool {
RegularStart, err := time.Parse(time.Kitchen, "10:05")
RegularEnd, err := time.Parse(time.Kitchen, "13:52")
return check.After(RegularStart) && check.Before(RegularEnd)
}

time := time.Now().UTC().Format("15:04")
if isWithinRegularService(time) { }

如果是常规服务,我将确定需要查看的时间(即本次或下一小时内的下一次服务)

if time.Minutes < 5 && time.Minutes >= 0 {
RegularTimes[0] = fmt.Sprintf("%s%s", time.Hour+1, RegularTimes[0])
RegularTimes[1] = fmt.Sprintf("%s%s", time.Hour+1, RegularTimes[1])
RegularTimes[2] = fmt.Sprintf("%s%s", time.Hour+1, RegularTimes[2])
RegularTimes[3] = fmt.Sprintf("%s%s", time.Hour+1, RegularTimes[3])
} else {
RegularTimes[0] = fmt.Sprintf("%s%s", time.Hour, RegularTimes[0])
RegularTimes[1] = fmt.Sprintf("%s%s", time.Hour, RegularTimes[1])
RegularTimes[2] = fmt.Sprintf("%s%s", time.Hour, RegularTimes[2])
RegularTimes[3] = fmt.Sprintf("%s%s", time.Hour, RegularTimes[3])
}

在我将该数组传递给另一个 func 之前给我检查的时间

type BusTime struct {
betweenStart string
betweenEnd string
}

func getBusTime(busTimes []array, iteration int) BusTime {

var timesToReturn BusTime

if iteration == busTimes.Count()-1 {
timesToReturn.betweenStart = busTimes[iteration]
timesToReturn.betweenEnd = busTimes[0]
} else {
timesToReturn.betweenStart = busTimes[iteration]
timesToReturn.betweenEnd = busTimes[iteration+1]
}

return timesToReturn
}

busTimes := getBusTime(quaylinkRegularTimes, i)

最后我检查提供的时间是否在要比较的时间之间:

check.After(start) && check.Before(end)

这就是这个项目的全部内容。如果它不提供常规服务,它会执行完全相同的操作,但会跳过确定观看时间的步骤。

目前这还没有建立,因为我在应该使用时间的地方使用字符串,我希望得到一些指导、一些示例和更正,以了解如何正确使用时间来实现我想要做的事情。到目前为止,我相信我的逻辑是正确的,但我无法编译它。

最佳答案

由于 time.Time 是一个特定的时刻,在特定的位置,将它用于没有日期或时区的任意时钟时间可能会很尴尬。您真正要寻找的是从 00:00 开始的持续时间,因此 time.Duration 更有意义。例如,您甚至可以根据自午夜以来的分钟数使用您自己的类型,但如果您使用 time.Duration,您将能够使用 time.Time 编写您的时间更容易。

这是一个示例函数,用于将您的时钟时间和分钟解析为 time.Duration

func ParseTime(t string) (time.Duration, error) {
var mins, hours int
var err error

parts := strings.SplitN(t, ":", 2)

switch len(parts) {
case 1:
mins, err = strconv.Atoi(parts[0])
if err != nil {
return 0, err
}
case 2:
hours, err = strconv.Atoi(parts[0])
if err != nil {
return 0, err
}

mins, err = strconv.Atoi(parts[1])
if err != nil {
return 0, err
}
default:
return 0, fmt.Errorf("invalid time: %s", t)
}

if mins > 59 || mins < 0 || hours > 23 || hours < 0 {
return 0, fmt.Errorf("invalid time: %s", t)
}

return time.Duration(hours)*time.Hour + time.Duration(mins)*time.Minute, nil
}

您还可以将其与您自己的类型结合使用,使用相同的底层 int64 类型,以便您可以轻松格式化 time.Duration 并添加您自己的方法。如果从 ParseTime 返回 Timetime.Duration 更方便,则由您决定。这里的两个是可以直接转换的。

type Time int64

func (t Time) Hours() int {
return int(time.Duration(t) / time.Hour)
}

func (t Time) Minutes() int {
return int((time.Duration(t) % time.Hour) / time.Minute)
}

func (t Time) String() string {
return fmt.Sprintf("%02d:%02d", t.Hours(), t.Minutes())
}

您可以像这样组合这些:http://play.golang.org/p/E679m2wlUO

关于时间格式化和从字符串转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33575967/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com