大家好,我叫谢伟,是一名程序员。
之前梳理了一些内置库的学习,收到了一些评论,绝大多数评论都在直指一个问题:为什么梳理这些无关痛痒的内置库?
好吧,看上去确实都是些简单的内置库的梳理。主要原因是为了:《后端工程师的攻略》这个系列,从零起步,教程到这个地步,看上去是需要提高难度了。后续加以改善。另外一个原因,其实是想告诉初学者,内置库的很多代码组织方式,代码的编写方式指的学习、借鉴、参考。
这期是我之前准备的,趁着这期还是放送出来吧。
核心很简单:懂 Go 的基本语法,会使用内置库的 time, 基本能搞到这些。
大纲:
前段日子项目中需要使用的国家规定的节假日,所以需要获取这些数据。其实获取这些数据的方式也很多:
于是本着简洁的方式,编写这么一个节假日的库。
要求:
数据源需要可靠,所以需要寻找官方的通知来源。
一般的方式呢,就是网页数据抓取,解析出得到的数据。
这是第一步,获取数据;当然,很多网站都可以找到这些信息,这里仅仅举例。
关于节假日,我们最需要知道的是什么信息?
基于此,可以这么设计结构体:
type OneCollection struct {
Start string `json:"start"`
End string `json:"end"`
ChName string `json:"ch_name"`
EnName string `json:"en_name"`
}
包括:
关于节假日名称呢,国家法定的节日是这么几个:元旦、春节、清明、端午、劳动、中秋、国庆
借鉴许多内置库的处理方式:这种固定的数据的处理,可以使用枚举类型:
const (
NewYearDay = iota
SpringFestivalDay
TombSweepingDay
LaborDay
DragonBoatFestivalDay
NationalDay
MidAutumnFestivalDay
)
var ChHolidays = [...]string{
"元旦",
"春节",
"清明节",
"劳动节",
"端午节",
"中秋节",
"国庆节",
}
var EnHolidays = [...]string{
"New Year\\'s Day",
"Spring Festival",
"Tomb-sweeping Day",
"Labour Day",
"Dragon Boat Festival",
"Mid-autumn Festival",
"National Day",
}
中英文,获取指定偏移量上的数据即可,这种处理方式在内置库很常见:比如时间类型的时间基本单位月:一月、二月、三月等
基于上文的分析,要构建这个简单的库,要组织历史节假日,这边选取 2010年到 2019 年的数据。
// 一年
type YearCollection struct {
Data []OneCollection `json:"data"`
}
// n 年
type CollectionYearHistory struct {
Data [][]OneCollection `json:"data"`
}
// 2010 年到 2019年历史数据
func FetchCollectionYearHistory() CollectionYearHistory {
return CollectionYearHistory{
Data: [][]OneCollection{
holiday2019,
holiday2018,
holiday2017,
holiday2016,
holiday2015,
holiday2014,
holiday2013,
holiday2012,
holiday2011,
holiday2010,
},
}
}
- FetchAll
- FetchByChName(year int, name string)
- FetchByEnName(year int, name string)
- FetchByMonth(year int, month int)
- FetchByYear(year int)
- FetchMonthHolidayCount(year int, month int)
- FetchYearHolidayCount(year int)
- IsHoliday
- IsWeekDay
- IsWorkDay
之所以这样设计, 是因为项目中经常会是这样的操作:
基于这些需求,构建了上文的API
以几个API 为例,详细的操作如何实现?
// FetchByYear get holidays by year in china
func FetchByYear(year int) []history.OneCollection {
var index int
nowYear, _, _ := time.Now().Date()
if year > nowYear+1 {
return nil
}
index = nowYear + 1 - year
return history.FetchCollectionYearHistory().Data[index]
}
func FetchByMonth(year int, month int) []history.OneCollection {
if month < 1 || month > 12 {
return nil
}
collections := FetchByYear(year)
var data []history.OneCollection
for _, collection := range collections {
collectionTime, _ := time.Parse("2006/01/02", collection.End)
if int(collectionTime.Month()) == month {
data = append(data, collection)
}
}
return data
}
func IsHoliday(value string) bool {
collectionTime, err := time.Parse("2006/01/02", value)
if err != nil {
return false
}
nowYear, _, _ := time.Now().Date()
if collectionTime.Year() > nowYear+1 {
return false
}
collections := FetchByYear(collectionTime.Year())
for _, collection := range collections {
startDate, _ := getDate(collection.Start)
endDate, _ := getDate(collection.End)
if collectionTime.Unix() >= startDate.Unix() && collectionTime.Unix() <= endDate.Unix() {
return true
}
}
return false
}
// IsWeekDay: judge date is week day or not
func IsWeekDay(value string) bool {
return !IsWorkDay(value) && !IsHoliday(value)
}
<后记>
基于上文的理念,其实可以写很多小工具:
比如:
<完>
原网址: 访问
创建于: 2024-01-01 18:25:13
目录: default
标签: 无
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论