Go每日一库之12:carbon(日期和时间)

2023-09-19 10:29:00 浏览数 (1)

简介

一线开发人员每天都要使用日期和时间相关的功能,各种定时器,活动时间处理等。标准库time使用起来不太灵活,特别是日期时间的创建和运算。carbon库是一个时间扩展库,基于 PHP 的carbon库编写。提供易于使用的接口。本文就来介绍一下这个库。

快速使用

第三方库需要先安装:

代码语言:javascript复制
$ go get github.com/uniplaces/carbon

后使用:

代码语言:javascript复制
package main

import (
  "fmt"
  "time"

  "github.com/uniplaces/carbon"
)

func main() {
  fmt.Printf("Right now is %sn", carbon.Now().DateTimeString())

  today, _ := carbon.NowInLocation("Japan")
  fmt.Printf("Right now in Japan is %sn", today)

  fmt.Printf("Tomorrow is %sn", carbon.Now().AddDay())
  fmt.Printf("Last week is %sn", carbon.Now().SubWeek())

  nextOlympics, _ := carbon.CreateFromDate(2016, time.August, 5, "Europe/London")
  nextOlympics = nextOlympics.AddYears(4)
  fmt.Printf("Next olympics are in %dn", nextOlympics.Year())

  if carbon.Now().IsWeekend() {
    fmt.Printf("Happy time!")
  }
}

carbon库的使用很便捷,首先它完全兼容标准库的time.Time类型,实际上该库的日期时间类型Carbon直接将time.Time内嵌到结构中,所以time.Time的方法可直接调用:

代码语言:javascript复制
// src/github.com/uniplaces/carbon/carbon.go
type Carbon struct {
  time.Time
  weekStartsAt time.Weekday
  weekEndsAt   time.Weekday
  weekendDays  []time.Weekday
  stringFormat string
  Translator   *Translator
}

其次,简化了创建操作。标准库time创建一个Time对象,如果不是本地或 UTC 时区,需要自己先调用LoadLocation加载对应时区。然后将该时区对象传给time.Date方法创建。carbon可以直接传时区名字。

carbon还提供了很多方法做日期运算,如例子中的AddDaySubWeek等,都是见名知义的。

时区

在介绍其它内容之前,我们先说一说这个时区的问题。以下引用维基百科的描述:

时区是地球上的区域使用同一个时间定义。以前,人们通过观察太阳的位置(时角)决定时间,这就使得不同经度的地方的时间有所不同(地方时)。1863年,首次使用时区的概念。时区通过设立一个区域的标准时间部分地解决了这个问题。 世界各国位于地球不同位置上,因此不同国家,特别是东西跨度大的国家日出、日落时间必定有所偏差。这些偏差就是所谓的时差。

例如,日本东京位于东九区,北京位于东八区,所以日本比中国快一个小时,日本14:00的时候中国13:00。

在 Linux 中,时区一般存放在类似/usr/share/zoneinfo这样的目录。这个目录中有很多文件,每个时区一个文件。时区文件是二进制文件,可以执行info tzfile查看具体格式。

时区名称的一般格式为city,或country/city,或continent/city。即要么就是一个城市名,要么是国家名 / 城市名,要么是洲名 / 城市名。例如上海时区为Asia/Shanghai,中国香港时区为Asia/Hong_Kong。也有一些特殊的,如 UTC,Local等。

Go 语言为了可移植性,在安装包中提供了时区文件,在安装目录下(我的为C:Go)的lib/time/zoneinfo.zip文件,大家可以执行解压看看

0 人点赞