1. 前言
时间是人类生活的核心。我们无时无刻不在使用时间来组织我们的生活,例如约会时间、工作时间和休息时间。为此,开发一个日程日历及微信提醒系统对我们的生活更是重要。Go语言中有强大的时间处理库,可以帮助我们轻松完成这个任务。本文将介绍如何使用 Go 语言中的时间函数生成日程日历并生成微信提醒。
2. 时间基础
2.1 Go中的时间
Go语言中,时间表示为time.Time
类型。我们可以通过time.Now()
函数获取当前的时间,并使用time.Parse()
函数将字符串转化为时间对象。
在 Go 语言中,时间有三种表示形式:
本地时间:指当地的标准时间,包含时区和DST(夏令时)信息。
UTC时间:指全球同一时刻的时间,没有时区和DST信息。
Unix时间戳:指自 1970-01-01 00:00:00 UTC 起的秒数(常用)或纳秒数。
2.2 时间格式化
时间对象可以通过time.Format()
函数将其格式化为字符串,也可以通过time.Parse()
函数将字符串解析为时间对象。
package main
import (
"fmt"
"time"
)
func main() {
fmt.Println(time.Now()) // 2022-07-28 11:26:42.261329 +0800 CST m=+0.000128220
fmt.Println(time.Now().Format("2006-01-02 15:04:05")) // 2022-07-28 11:26:42
t1, _ := time.Parse("2006-01-02 15:04:05", "2022-07-28 11:26:42")
fmt.Println(t1) // 2022-07-28 11:26:42 +0000 UTC
}
3. 日历生成
3.1 生成指定日期的日历
我们可以通过时间函数计算出某个日期的所有信息,然后根据信息生成对应的日历。
package main
import (
"fmt"
"time"
)
func main() {
date := "2022-08-01"
t, _ := time.Parse("2006-01-02", date)
fmt.Println(t) // 2022-08-01 00:00:00 +0000 UTC
fmt.Println(t.Year()) // 2022
fmt.Println(t.Month()) // August
fmt.Println(t.Day()) // 1
fmt.Println(t.Weekday()) // Monday
fmt.Println(t.AddDate(0, 1, -1)) // 2022-08-31 00:00:00 +0000 UTC
}
根据上述代码,我们可以计算出2022年8月份的日历信息,接下来就可以根据生成的信息生成对应的日历了。
3.2 生成当前月份的日历
我们可以通过当前日期计算出当前月份的日历信息,然后生成相应的日历。
package main
import (
"fmt"
"time"
)
func main() {
now := time.Now()
year, month, _ := now.Date()
firstDay := time.Date(year, month, 1, 0, 0, 0, 0, time.Local)
lastDay := firstDay.AddDate(0, 1, -1)
fmt.Println(" 日 一 二 三 四 五 六")
for i := 0; i < int(firstDay.Weekday()); i++ {
fmt.Print(" ")
}
for i := 1; i <= lastDay.Day(); i++ {
fmt.Printf(" %2d", i)
if (i+int(firstDay.Weekday()))%7 == 0 {
fmt.Println("")
}
}
}
生成的日历样式如下:
日 一 二 三 四 五 六
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
4. 微信提醒
在 Go 中,可以使用 wechat-go 库实现微信的消息推送。
首先,我们需要在公众号后台开通“开发者模式”,并获得appID
和appsecret
。
接下来,我们可以使用wechat-go
库发送微信消息。
package main
import (
"fmt"
"github.com/silenceper/wechat"
"github.com/silenceper/wechat/message"
)
func main() {
cfg := &wechat.Config{
AppID: "your AppID",
AppSecret: "your AppSecret",
Token: "your Token",
}
wc := wechat.NewWechat(cfg)
token, err := wc.GetAccessToken()
if err != nil {
fmt.Println(err)
return
}
fmt.Println(token)
msg := message.NewText("hello world")
msg.SetAgentID("your AgentID")
msg.SetToUser("your openid")
_, err = wc.SendMessage(msg)
if err != nil {
fmt.Println(err)
return
}
}
通过上述代码,我们可以向指定的用户发送消息。接下来,我们可以将微信提醒与日历相结合,每天定时向用户推送当月的日历信息。
package main
import (
"fmt"
"time"
"github.com/silenceper/wechat"
"github.com/silenceper/wechat/cache"
"github.com/silenceper/wechat/message"
)
const (
appID = "your AppID"
appSecret = "your AppSecret"
token = "your Token"
openID = "your openid"
)
func main() {
cfg := &wechat.Config{
AppID: appID,
AppSecret: appSecret,
Token: token,
Cache: cache.NewRedis(&cache.RedisOpts{Host: "127.0.0.1:6379"}),
}
wc := wechat.NewWechat(cfg)
ticker := time.NewTicker(time.Hour * 24)
for {
now := time.Now()
next := now.Add(time.Hour * 24)
next = time.Date(next.Year(), next.Month(), next.Day(), 0, 0, 0, 0, time.Local)
select {
case <-ticker.C:
if now.Day() != next.Day() {
continue
}
msg := message.NewText(getMonthCalendar(now))
msg.SetAgentID(0)
msg.SetToUser(openID)
_, err := wc.SendMessage(msg)
if err != nil {
fmt.Println(err)
continue
}
}
}
}
func getMonthCalendar(now time.Time) string {
year, month, _ := now.Date()
firstDay := time.Date(year, month, 1, 0, 0, 0, 0, time.Local)
lastDay := firstDay.AddDate(0, 1, -1)
calendar := fmt.Sprintf(" %d年%d月\n 日 一 二 三 四 五 六\n", year, month)
for i := 0; i < int(firstDay.Weekday()); i++ {
calendar += " "
}
for i := 1; i <= lastDay.Day(); i++ {
calendar += fmt.Sprintf(" %2d", i)
if (i+int(firstDay.Weekday()))%7 == 0 {
calendar += "\n"
}
}
return calendar
}
通过上述代码,我们每天定时向指定用户推送当月的日历信息。
5. 总结
本文介绍了如何使用 Go 语言中的时间函数生成日程日历并生成微信提醒,主要涉及以下内容:
Go 中的时间基础;
如何生成指定日期或当前月份的日历;
如何使用 wechat-go 库发送微信消息;
将微信提醒与日历相结合。
通过本文,您可以学习到 Go 中的时间处理及微信消息推送知识。