golang实现波斯(回历)日历转换功能的插件库go-persian-calendar的使用

Go Persian Calendar 使用指南

Go Persian Calendar 是一个用于波斯历(回历)和公历之间转换的 Golang 库。它使用 Julian 日历作为所有转换的接口,包名为 ptime,并且与标准库 time 包兼容。

安装

go get github.com/yaa110/go-persian-calendar

快速开始

1. 导入包

import (
    ptime "github.com/yaa110/go-persian-calendar"
    "time"
    "fmt"
)

2. 公历转波斯历

// 创建一个 time.Time 实例
var t time.Time = time.Date(2016, time.January, 1, 12, 1, 1, 0, ptime.Iran())

// 使用 time.Time 创建 ptime.Time 实例
pt := ptime.New(t)

// 获取波斯历日期
fmt.Println(pt.Date()) // 输出: 1394 دی 11

3. 波斯历转公历

// 创建一个 ptime.Time 实例
var pt ptime.Time = ptime.Date(1394, ptime.Mehr, 2, 12, 59, 59, 0, ptime.Iran())

// 获取 time.Time 实例
t := pt.Time()

// 获取公历日期
fmt.Println(t.Date()) // 输出: 2015 September 24

4. 获取当前时间

// 获取表示当前时间的 ptime.Time 实例
pt := ptime.Now()

// 获取年、月、日
fmt.Println(pt.Date()) // 输出: 1394 بهمن 11
fmt.Println(pt.Year(), pt.Month(), pt.Day()) // 输出: 1394 بهمن 11

// 获取时、分、秒
fmt.Println(pt.Clock()) // 输出: 21 54 30
fmt.Println(pt.Hour(), pt.Minute(), pt.Second()) // 输出: 21 54 30

// 获取 Unix 时间戳
fmt.Println(pt.Unix()) // 输出: 1454277270

// 获取昨天、今天和明天
fmt.Println(pt.Yesterday().Weekday()) // 输出: شنبه
fmt.Println(pt.Weekday()) // 输出: یک‌شنبه
fmt.Println(pt.Tomorrow().Weekday()) // 输出: دوشنبه

// 获取本周的第一天和最后一天
fmt.Println(pt.FirstWeekDay().Date()) // 输出: 1394 بهمن 10
fmt.Println(pt.LastWeekday().Date()) // 输出: 1394 بهمن 16

// 获取本月的第一天和最后一天
fmt.Println(pt.FirstMonthDay().Weekday()) // 输出: پنج‌شنبه
fmt.Println(pt.LastMonthDay().Weekday()) // 输出: جمعه

// 获取本年的第一天和最后一天
fmt.Println(pt.FirstYearDay().Weekday()) // 输出: شنبه
fmt.Println(pt.LastYearDay().Weekday()) // 输出: شنبه

// 获取本月第几周
fmt.Println(pt.MonthWeek()) // 输出: 3

// 获取本年第几周
fmt.Println(pt.YearWeek()) // 输出: 46

// 获取本年剩余周数
fmt.Println(pt.RYearWeek()) // 输出: 6

5. 格式化时间

// 使用 Unix 时间戳创建 ptime.Time 实例
pt := ptime.Unix(1454277270, 0)

fmt.Println(pt.Format("yyyy/MM/dd E hh:mm:ss a")) // 输出: 1394/11/11 یک‌شنبه 09:54:30 ب.ظ

// 格式化符号说明:
// yyyy, yyy, y     年份 (如 1394)
// yy                2位年份表示 (如 94)
// MMM              波斯月份名称 (如 فروردین)
// MMI              Dari 月份名称 (如 حمل)
// MM                2位月份表示 (如 01)
// M                 月份 (如 1)
// rw                本年剩余周数
// w                 本年周数
// W                 本月周数
// RD                本年剩余天数
// D                 本年第几天
// rd                本月剩余天数
// dd                2位天数表示 (如 01)
// d                 天数 (如 1)
// E                 波斯星期名称 (如 شنبه)
// e                 波斯星期简称 (如 ش)
// A                 12小时制全称 (如 قبل از ظهر)
// a                 12小时制简称 (如 ق.ظ)
// HH                24小时制2位表示 [00-23]
// H                 24小时制 [0-23]
// kk                24小时制2位表示 [01-24]
// k                 24小时制 [1-24]
// hh                12小时制2位表示 [01-12]
// h                 12小时制 [1-12]
// KK                12小时制2位表示 [00-11]
// K                 12小时制 [0-11]
// mm                2位分钟表示 [00-59]
// m                 分钟 [0-59]
// ss                2位秒数表示 [00-59]
// s                 秒数 [0-59]
// ns                纳秒
// S                 3位毫秒表示 (如 001)
// z                 时区名称
// Z                 时区偏移 (如 +03:30)

6. 使用标准格式格式化时间

pt := ptime.Date(1394, 7, 2, 14, 7, 8, 0, ptime.Iran())

fmt.Println(pt.TimeFormat("2 Jan 2006")) // 输出: 2 مهر 1394

// 标准格式说明:
// 2006        4位年份 (如 1399)
// 06          2位年份 (如 99)
// 01          2位月份 (如 01)
// 1           1位月份 (如 1)
// Jan         月份名称 (如 آذر)
// January     月份名称 (如 آذر)
// 02          2位天数 (如 07)
// 2           1位天数 (如 7)
// _2          右对齐2位天数 (如  7)
// Mon         星期名称 (如 شنبه)
// Monday      星期名称 (如 شنبه)
// 03          12小时制2位表示 (如 03)
// 3           12小时制1位表示 (如 3)
// 15          24小时制2位表示 (如 15)
// 04          2位分钟表示 (如 03)
// 4           1位分钟表示 (如 03)
// 05          2位秒数表示 (如 09)
// 5           1位秒数表示 (如 9)
// .000        毫秒 (如 .120)
// .000000     微秒 (如 .123400)
// .000000000  纳秒 (如 .123456000)
// .999        去除尾随零的毫秒 (如 .12)
// .999999     去除尾随零的微秒 (如 .1234)
// .999999999  去除尾随零的纳秒 (如 .123456)
// PM          12小时制全称 (如 قبل از ظهر)
// pm          12小时制简称 (如 ق.ظ)
// MST         时区名称
// -0700       时区偏移 (如 +0330)
// -07         时区偏移 (如 +03)
// -07:00      时区偏移 (如 +03:30)
// Z0700       时区偏移 (如 +0330)
// Z07:00      时区偏移 (如 +03:30)

限制

  • 公历年份的最小值是 1097,否则会返回零值的 ptime.Time 实例。

完整示例

package main

import (
    ptime "github.com/yaa110/go-persian-calendar"
    "fmt"
    "time"
)

func main() {
    // 当前时间
    now := ptime.Now()
    fmt.Println("当前波斯时间:", now.Format("yyyy/MM/dd E hh:mm:ss a"))
    
    // 公历转波斯历
    gregorian := time.Date(2023, time.July, 15, 14, 30, 0, 0, ptime.Iran())
    persian := ptime.New(gregorian)
    fmt.Println("公历 2023-07-15 对应的波斯历:", persian.Date())
    
    // 波斯历转公历
    persianDate := ptime.Date(1402, ptime.Tir, 24, 14, 30, 0, 0, ptime.Iran())
    gregorianDate := persianDate.Time()
    fmt.Println("波斯历 1402-04-24 对应的公历:", gregorianDate.Format("2006-01-02"))
    
    // 格式化示例
    fmt.Println("格式化日期:", now.Format("yyyy年MM月dd日 E"))
    fmt.Println("12小时制时间:", now.Format("hh:mm:ss a"))
    fmt.Println("24小时制时间:", now.Format("HH:mm:ss"))
}

这个库提供了丰富的功能来处理波斯历和公历之间的转换,以及波斯历的各种操作。


更多关于golang实现波斯(回历)日历转换功能的插件库go-persian-calendar的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang实现波斯(回历)日历转换功能的插件库go-persian-calendar的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


go-persian-calendar 库的使用指南

go-persian-calendar 是一个用于公历(格里高利历)与波斯历(回历)之间相互转换的 Go 语言库。下面我将详细介绍如何使用这个库。

安装

首先使用 go get 安装库:

go get github.com/yaa110/go-persian-calendar

基本用法

1. 导入库

import (
    "fmt"
    "github.com/yaa110/go-persian-calendar/ptime"
)

2. 创建当前时间的波斯历实例

now := ptime.Now()
fmt.Println("当前波斯历时间:", now)

3. 从公历创建波斯历实例

// 从公历年月日创建
date := ptime.Date(2023, 11, 15, 0, 0, 0, 0, ptime.UTC)
fmt.Println("公历2023-11-15对应的波斯历:", date)

// 从time.Time创建
gregorianTime := time.Date(2023, 11, 15, 12, 30, 0, 0, time.UTC)
persianDate := ptime.New(gregorianTime)
fmt.Println("转换后的波斯历:", persianDate)

常用功能示例

1. 获取日期各部分

date := ptime.Date(1402, 8, 24, 0, 0, 0, 0, ptime.UTC)
fmt.Println("年:", date.Year())      // 1402
fmt.Println("月:", date.Month())    // 8 (Aban)
fmt.Println("日:", date.Day())      // 24
fmt.Println("星期:", date.Weekday()) // 星期几
fmt.Println("一年中的第几天:", date.YearDay())

2. 格式化为字符串

date := ptime.Now()
fmt.Println("默认格式:", date.String())
fmt.Println("自定义格式:", date.Format("yyyy/MM/dd"))
fmt.Println("完整格式:", date.Format("yyyy/MM/dd HH:mm:ss"))

3. 转换为公历

persianDate := ptime.Date(1402, 8, 24, 0, 0, 0, 0, ptime.UTC)
gregorianTime := persianDate.Time()
fmt.Println("对应的公历日期:", gregorianTime.Format("2006-01-02"))

4. 日期计算

date := ptime.Now()

// 增加天数
future := date.AddDate(0, 0, 10)
fmt.Println("10天后:", future)

// 增加月数
future = date.AddDate(0, 2, 0)
fmt.Println("2个月后:", future)

// 增加年数
future = date.AddDate(3, 0, 0)
fmt.Println("3年后:", future)

// 计算两个日期的差值
date1 := ptime.Date(1402, 8, 24, 0, 0, 0, 0, ptime.UTC)
date2 := ptime.Date(1402, 9, 1, 0, 0, 0, 0, ptime.UTC)
days := date2.Sub(date1).Hours() / 24
fmt.Println("日期差值(天):", days)

5. 月份和星期名称

date := ptime.Now()
fmt.Println("月份名称:", date.Month().String())
fmt.Println("星期名称:", date.Weekday().String())

// 获取所有月份名称
fmt.Println("波斯历月份:")
for i := 1; i <= 12; i++ {
    fmt.Println(ptime.Month(i).String())
}

完整示例

package main

import (
	"fmt"
	"github.com/yaa110/go-persian-calendar/ptime"
	"time"
)

func main() {
	// 1. 获取当前波斯历时间
	now := ptime.Now()
	fmt.Printf("当前波斯历时间: %s\n", now.Format("yyyy/MM/dd HH:mm:ss"))
	
	// 2. 从公历创建波斯历
	gregorianDate := time.Date(2023, 11, 15, 0, 0, 0, 0, time.UTC)
	persianDate := ptime.New(gregorianDate)
	fmt.Printf("公历2023-11-15对应的波斯历: %s\n", persianDate.Format("yyyy年MM月dd日"))
	
	// 3. 转换为公历
	convertedBack := persianDate.Time()
	fmt.Printf("转换回公历: %s\n", convertedBack.Format("2006-01-02"))
	
	// 4. 日期计算
	future := persianDate.AddDate(0, 0, 30)
	fmt.Printf("30天后的日期: %s\n", future.Format("yyyy/MM/dd"))
	
	// 5. 获取月份和星期名称
	fmt.Printf("月份: %s, 星期: %s\n", 
		persianDate.Month().String(), 
		persianDate.Weekday().String())
	
	// 6. 判断是否是闰年
	fmt.Printf("当前年份(%d)是闰年吗? %t\n", 
		now.Year(), 
		ptime.IsLeap(now.Year()))
}

注意事项

  1. 波斯历的年份从公元622年开始计算(伊斯兰历元年)
  2. 波斯历的月份名称与公历不同,有特定的名称
  3. 一周的开始是星期六(波斯历习惯)
  4. 库中月份和星期的枚举都是从1开始的

这个库提供了丰富的功能来处理波斯历日期,包括格式化、解析、日期计算等,非常适合需要在Go应用中处理波斯历日期的场景。

回到顶部