Documentation
¶
Overview ¶
Package goliday 提供中国法定节假日与调休工作日的日期类型判定能力。
Package goliday 提供中国法定节假日与调休工作日的日期类型判定能力。
Index ¶
- Constants
- Variables
- type Adjust
- type Calendar
- func (c *Calendar) HasYear(year int) bool
- func (c *Calendar) IsRest(date time.Time) (bool, error)
- func (c *Calendar) IsWork(date time.Time) (bool, error)
- func (c *Calendar) Query(date time.Time) (DayType, error)
- func (c *Calendar) QueryCoarse(date time.Time) (DayType, error)
- func (c *Calendar) QueryRange(start, end time.Time) ([]Dated, error)
- func (c *Calendar) Stats(dates []time.Time, detailed bool) (StatsResult, error)
- func (c *Calendar) StatsRange(start, end time.Time, detailed bool) (StatsResult, error)
- type Dated
- type DayType
- func (t DayType) Adjustment() DayType
- func (t DayType) Coarse() DayType
- func (t DayType) IsAdjustedRestDay() bool
- func (t DayType) IsAdjustedWorkDay() bool
- func (t DayType) IsFestivalRest() bool
- func (t DayType) IsRest() bool
- func (t DayType) IsValid() bool
- func (t DayType) IsWork() bool
- func (t DayType) String() string
- type Festival
- type StatsResult
- type Store
- type YearConfig
Constants ¶
const ( // DayTypeFestivalRest 节日放假日:节日当天(无论落在工作日还是周末)。 DayTypeFestivalRest = DayTypeRest | DayTypeFestival // DayTypeAdjustedRestDay 调休放假日:原工作日被调整为休息(非节日当天)。 DayTypeAdjustedRestDay = DayTypeRest | DayTypeAdjustedRest // DayTypeAdjustedWorkDay 补班上班日:原周末被调整为上班。 DayTypeAdjustedWorkDay = DayTypeWork | DayTypeAdjustedWork )
合法细粒度组合值(终态五值,MECE),由基本位与调整位组合而成。
Variables ¶
var ErrYearNotLoaded = errors.New("年份配置未加载")
ErrYearNotLoaded 查询覆盖了未加载配置的年份。 未加载年份不再回退到系统周休判断,而是返回包装本错误的错误 (errors.Is 可判别),错误消息中包含具体年份。
Functions ¶
This section is empty.
Types ¶
type Adjust ¶
Adjust 描述某年的调休调整(稀疏表):
Off 放假日:原本需要上班(周一~周五)但被调整为休息的日期,含节日当天与调休日; Work 补班日:原本休息(周六/周日)但被调整为上班的日期。
type Calendar ¶
type Calendar struct {
// contains filtered or unexported fields
}
Calendar 提供日期类型查询与统计能力。由 Store 一次性构建各年份的 查找索引与组合计数前缀和,构造完成后只读,可被多个 goroutine 并发调用。
func NewCalendar ¶
NewCalendar 将 Store 中各年份的稀疏配置烘焙为各年的调整终态稀疏表 (键为年内天序),并为每年构建细粒度组合计数前缀和(供 StatsRange/ Stats 差分统计)。
func (*Calendar) Query ¶
Query 返回 date 的细粒度日期类型。任意时刻均先按其所在日规范化再查询。
判断优先级:节日当天 → FestivalRest(必为放假日);work 命中 → AdjustedWorkDay;off 命中 → AdjustedRestDay;周休回退(周末 → Rest, 否则 Work)——前三级已构建期收敛为单一 adjust 表,查询一次命中。 该年未加载配置时返回包装 ErrYearNotLoaded 的错误,不再回退周休判断。
func (*Calendar) QueryCoarse ¶
QueryCoarse 返回 date 的粗粒度日期类型(等价于 Query(date).Coarse())。
func (*Calendar) QueryRange ¶
QueryRange 逐日返回左闭右开区间 [start, end) 内每天的细粒度类型。
end 早于或等于 start 时返回空切片(空区间无覆盖年份,不校验加载状态)。 覆盖任一年份未加载时返回包装 ErrYearNotLoaded 的错误。本方法不限制 区间跨度,跨度上限校验由调用方(如 HTTP 层)负责。
func (*Calendar) Stats ¶
Stats 统计日期集合。dates 视为已去重升序的日期集合(去重与排序由 调用方负责),逐元素计数不去重。
实现上逐日取前缀和的单日差分(prefix[day] - prefix[day-1]),复用与 StatsRange 相同的前缀和数据。任一日期所在年份未加载时返回包装 ErrYearNotLoaded 的错误;空输入直接返回全零结果。
func (*Calendar) StatsRange ¶
StatsRange 统计左闭右开区间 [start, end)(不限跨度)。
基于构造期构建的组合计数前缀和差分:年内 O(1),跨年按 「首年段 + 若干整年段 + 末年段」拆分后逐段差分相加,复杂度 O(覆盖年数)。 覆盖任一年份未加载时返回包装 ErrYearNotLoaded 的错误; end 早于或等于 start 时返回全零结果(空区间无覆盖年份,不校验)。
type DayType ¶
type DayType uint8
DayType 表示某一天的日期类型,采用位掩码(bitmask)编码, 分为「终态双层」:
粗粒度基本位(互斥,恰一个,表达当日最终是否上班):
DayTypeWork 1<<0 上班;单值 1 即普通工作日 DayTypeRest 1<<1 放假;单值 2 即普通周休(未调整时必然为周末)
调整位(互斥,至多一个,依附于基本位):
DayTypeFestival 1<<2 过节:法定节日当天(放假),当日新增法定假期 DayTypeAdjustedRest 1<<3 调休:原工作日被调整为休息(非节日当天),不新增假期 DayTypeAdjustedWork 1<<4 补班:原周末被调整为上班
全部组合值的按位或均为 all-of(合取)语义,不存在 any-of(并集物化值) 语义;粗粒度即基本位投影(t.Coarse())。合法细粒度值全集为 {1, 2, 6, 10, 17},五值 MECE;零值 DayTypeUnknown(0) 表示未定义类型 (非合法取值),可直接作为默认值。
const ( // DayTypeUnknown 未定义类型(零值/默认值):非合法细粒度取值, // 判类恒 false,String() 输出 "unknown"。 DayTypeUnknown DayType = 0 // DayTypeWork 上班(粗粒度基本位;单值即普通工作日)。 DayTypeWork DayType = 1 << 0 // DayTypeRest 放假(粗粒度基本位;单值即普通周休,未调整时必然为周末)。 DayTypeRest DayType = 1 << 1 // DayTypeFestival 过节:法定节日当天(放假),当日新增法定假期。 DayTypeFestival DayType = 1 << 2 // DayTypeAdjustedRest 调休:原工作日被调整为休息(非节日当天),不新增假期。 DayTypeAdjustedRest DayType = 1 << 3 // DayTypeAdjustedWork 补班:原周末被调整为上班。 DayTypeAdjustedWork DayType = 1 << 4 )
func (DayType) Adjustment ¶
Adjustment 返回该日期类型的调整位投影(调整掩码), 即 t & dayTypeAdjustMask,与 Coarse 相对应;合法值上 结果 ∈ {0, 4, 8, 16}(无调整位时为 0)且幂等, 非法值(如 12,多调整位并存)返回原值本身。
func (DayType) Coarse ¶
Coarse 返回该日期类型的粗粒度投影(基本位掩码), 即 t & dayTypeCoarseMask;合法值上结果 ∈ {1, 2} 且幂等, 非法值(如 3,同含两个基本位)返回原值本身。
func (DayType) IsAdjustedRestDay ¶
IsAdjustedRestDay 报告该日是否为调休放假日:合法值且调整位投影等于 DayTypeAdjustedRest;任何非法值均返回 false。
func (DayType) IsAdjustedWorkDay ¶
IsAdjustedWorkDay 报告该日是否为补班上班日:合法值且调整位投影等于 DayTypeAdjustedWork;任何非法值均返回 false。
func (DayType) IsFestivalRest ¶
IsFestivalRest 报告该日是否为节日放假日:合法值且调整位投影等于 DayTypeFestival(与 IsWork/IsRest 同构,先校验再投影判等)。
type StatsResult ¶
StatsResult 统计结果:
Total 覆盖天数(区间天数或 len(dates),不做去重);
Coarse 粗粒度计数,键为 DayTypeWork / DayTypeRest;
Fine 细粒度五键 MECE 计数(普通工作日/普通周休/节日放假日/
调休放假日/补班日),各键之和恒等于 Total;detailed=false 时为 nil。
type Store ¶
type Store struct {
// contains filtered or unexported fields
}
Store 持有多个年份的稀疏配置。加载完成后只读,读取方法并发安全。
type YearConfig ¶
YearConfig 描述某一年的节假日稀疏配置。
func LoadYear ¶
func LoadYear(path string) (*YearConfig, error)
LoadYear 读取并解析单个年份配置文件,执行校验后返回 YearConfig。
文件名(去扩展名)须为纯四位数字年份,且与文件内 year 字段一致。 返回的错误信息以文件路径开头,便于定位。
func (*YearConfig) Validate ¶
func (c *YearConfig) Validate() error
Validate 校验 YearConfig 是否符合稀疏表约束,错误信息指明文件内具体原因:
- 所有日期年份须等于 c.Year;
- off 中日期须为周一~周五,work 中日期须为周六/周日;
- off、work 各自无重复,且两者互斥;
- work 不得包含任何 festival.date(节日当天不得补班);
- festival.date 为周一~周五时必须在 off 中——节日当天必为放假日, 工作日节日须经 off 落地(否则该日在类型上无合法状态可归, Work|Festival 为非法值);
- festival.date 之间无重复。
Directories
¶
| Path | Synopsis |
|---|---|
|
cmd
|
|
|
goliday-server
command
gRPC 服务实现:GolidayService 三方法与 grpc 标准健康检查,与 HTTP 同进程。
|
gRPC 服务实现:GolidayService 三方法与 grpc 标准健康检查,与 HTTP 同进程。 |
|
goliday-tool
command
Command goliday-tool 提供年份配置的校验(validate)与生成(gen)子命令。
|
Command goliday-tool 提供年份配置的校验(validate)与生成(gen)子命令。 |
|
proto
|
|