Golang程序 计算两个时间段之间差异

Golang程序 计算两个时间段之间差异

在本教程中,我们将编写一个golang程序来计算以下程序中给出的两个时间段之间的差异。为了得到两个时间段的时间差,我们可以使用一个库函数,也可以创建一个单独的用户定义的函数来实现这个结果。

方法1:使用内部函数计算两个时间段的差异

在这个方法中,我们将编写一个go语言程序,使用go编程语言中的预定义函数来寻找时间段之间的差异。

语法

func (t Time) Sub(u Time) Duration

go中的sub()函数是用来获取两个日期之间的差值。在这个函数中,前两个参数,即t和u是日期值,这个函数返回两个值之间的差异,单位是小时、分钟和秒。

算法

第1步 – 首先,我们需要导入fmt和时间。时间包允许我们使用其他预定义的包,如time.Date()。

第2步 – 启动main()函数。

第3步 – 通过在time.Date()函数中按yy/mm/dd/hrs/min/sec的顺序传递日期和时间,初始化firstDate和secondDate变量。

第4步 – 使用Sub()函数查找给定日期之间的差异,该函数将第二个日期作为参数,并计算出所需的差异。

第5步 – 在屏幕上以各种格式打印结果。

第6步 – 我们可以打印年、日、月、周、小时、秒、毫秒,等等。

示例

Golang程序使用内部函数计算两个时间段的差异

package main
import (
   "fmt"
   "time"
)
func main() {
   firstDate := time.Date(2022, 4, 13, 3, 0, 0, 0, time.UTC)
   secondDate := time.Date(2010, 2, 12, 6, 0, 0, 0, time.UTC)
   difference := firstDate.Sub(secondDate)
   fmt.Println("The difference between dates", firstDate, "and", secondDate, "is: ")
   fmt.Printf("Years: %d\n", int64(difference.Hours()/24/365))
   fmt.Printf("Months: %d\n", int64(difference.Hours()/24/30))
   fmt.Printf("Weeks: %d\n", int64(difference.Hours()/24/7))
   fmt.Printf("Days: %d\n", int64(difference.Hours()/24))
   fmt.Printf("Hours: %.f\n", difference.Hours())
   fmt.Printf("Minutes: %.f\n", difference.Minutes())
   fmt.Printf("Seconds: %.f\n", difference.Seconds())
   fmt.Printf("Nanoseconds: %d\n", difference.Nanoseconds())
}

输出

The difference between dates 2022-04-13 03:00:00 +0000 UTC and 2010-02-12
06:00:00 +0000 UTC is:
Years: 12
Months: 148
Weeks: 634
Days: 4442
Hours: 106629
Minutes: 6397740
Seconds: 383864400
Nanoseconds: 383864400000000000

方法2:使用用户定义的函数计算两个时间段的差异

在这个方法中,我们将创建一个不同的函数来计算两个提供的日期之间的差异。该函数将把两个日期作为参数并返回各自的结果。

算法

第1步 – 首先,我们需要导入 fmt 和 time 包。时间包允许我们使用其他预定义的函数,如time.Date()。

第2步 – 创建 leapYear() 函数来计算两个日期之间的闰年数。

第3步 – 同时创建getDifference()函数来获取日期和时间的差异。 getDifference()函数返回天数、小时、分钟和秒数。

第4步 – 启动main()函数。

第5步 – 通过在time.Date()函数中按照yy/mm/dd/hrs/min/sec的顺序传递日期和时间,初始化date1和date2变量。

第6步 – 如果日期1发生在日期2之后,则交换这两个日期。

第7步 – 通过将两个日期作为参数传递给函数,调用getDifference()。

第8步 – 将函数得到的结果存储在不同的变量中,并使用fmt.Println()函数将它们以不同格式打印在屏幕上。

示例

使用用户定义的函数计算两个时间段的差异的Golang程序

package main
import (
   "fmt"
   "time"
)
func leapYears(date time.Time) (leaps int) {
   y, m, _ := date.Date()
   if m <= 2 {
      y--
   }
   leaps = y/4 + y/400 - y/100
   return leaps
}
func getDifference(a, b time.Time) (days, hours, minutes, seconds int) {
   monthDays := [12]int{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
   y1, m1, d1 := a.Date()
   y2, m2, d2 := b.Date()
   h1, min1, s1 := a.Clock()
   h2, min2, s2 := b.Clock()
   totalDays1 := y1*365 + d1
   for i := 0; i < (int)(m1)-1; i++ {
      totalDays1 += monthDays[i]
   }
   totalDays1 += leapYears(a)
   totalDays2 := y2*365 + d2
   for i := 0; i < (int)(m2)-1; i++ {
      totalDays2 += monthDays[i]
   }
   totalDays2 += leapYears(b)
   days = totalDays2 - totalDays1
   hours = h2 - h1
   minutes = min2 - min1
   seconds = s2 - s1
   if seconds < 0 {
      seconds += 60
      minutes--
   }
   if minutes < 0 {
      minutes += 60
      hours--
   }
   if hours < 0 {
      hours += 24
      days--
   }
   return days, hours, minutes, seconds
}
func main() {
   date1 := time.Date(2020, 4, 27, 23, 35, 0, 0, time.UTC)
   date2 := time.Date(2018, 5, 12, 12, 43, 23, 0, time.UTC)
   if date1.After(date2) {
      date1, date2 = date2, date1
   }
   days, hours, minutes, seconds := getDifference(date1, date2)
   fmt.Println("The difference between dates", date1, "and", date2, "is: ")
   fmt.Printf("%v days\n%v hours\n%v minutes\n%v seconds", days, hours, minutes, seconds)
}

输出

The difference between dates 2018-05-12 12:43:23 +0000 UTC and 2020-04-27
23:35:00 +0000 UTC is:
716 days
10 hours
51 minutes
37 seconds

结论

我们已经成功地编译并执行了一个go语言程序,以获得两个时间段之间的差异,并附有实例。在第一个例子中,我们使用了内部函数,在第二个例子中,我们使用了一个用户定义的函数来获得结果。