* map.txt

        '高三' => '03-2016','高二' => '03-2017','高一' => '03-2018','初三' => '02-2016','初二' => '02-2017','初一' => '02-2018','小六' => '01-2013',// 五四制的初中'六年级'=>'02-2018','七年级'=>'02-2017','八年级'=>'02-2016','九年级'=>'02-2015','高中' => '03-0000','初中' => '02-0000','小学' => '01-0000',

* format.php

// 用于生成test case

<?phpfunction fileForEachRow($path, $handler) {$handle = fopen($path, "r");if (! $handle ) {return;}while (($buffer = fgets($handle, 1024) ) !== false) {$buffer = trim($buffer);call_user_func($handler, $buffer);}if (!feof($handle)) {echo "Error: unexpected fgets() fail\n";}fclose($handle);
}fileForEachRow("map.txt", function($line) {$line = trim($line);$n = strlen($line);if ($n === 0) {return;}if (substr($line, 0, 2) === "//") {return;}// echo $line.PHP_EOL;$col = explode("=>", $line);for ($i = 0; $i < count($col); $i++) {$col[$i] = trim($col[$i], ", \t'\"");}$grade = $col[0];$zh = $col[1];printf("assert.Equal(t, ConvertGradeChinese2Gradeno(\"%s\", now), \"%s\")\n", $grade, $zh);});

* converter.go

注意golang switch case语句自动添加break

如果不需要break,必须用fallthrough关键字

package utilimport ("fmt""github.com/pkg/errors""time"
)type Converter struct{}var GRADE_NAME_TO_ID map[string]stringfunc (this *Converter) init() {if len(GRADE_NAME_TO_ID) == 0 {// GRADE_NAME_TO_ID = getMapGradeName2ID()GRADE_NAME_TO_ID = GetMapGradeName2IdByTime(time.Now())}
}func (this *Converter) GradeChinese2Gradeno(grade string) string {this.init()return GRADE_NAME_TO_ID[grade]
}func ConvertGradeChinese2Gradeno(grade string, date time.Time) string {// 不变的3种情况switch grade {case "高中": return "03-0000"case "初中": return "02-0000"case "小学": return "01-0000"default:}year := date.Year()month := int32(date.Month())// 每年7月1日0点更新 下半学年(上半年)if month >= 7 {year += 1}gmy := &GradeMonthYear{}gmy.getByRune(grade, int32(year))return gmy.toString()
}type CompareFunc func(interface{}, interface{}) int32func indexOf(a []interface{}, e interface{}, cmp CompareFunc) int32 {n := int32(len(a))var i int32 = 0for ; i < n; i++ {if cmp(e, a[i]) == 0 {return i}}return -1
}type GradeMonthYear struct {Month int32Year  int32
}func (this *GradeMonthYear) toString() string {return fmt.Sprintf("%02d-%04d", this.Month, this.Year)
}func (this *GradeMonthYear) getByRune(ws string, year int32) error {zh := []rune{'零', '一', '二', '三', '四', '五', '六', '七', '八', '九'}zh_Numbers := make([]interface{}, len(zh))for i, v := range zh {zh_Numbers[i] = v}runeCmp := func(i interface{}, i2 interface{}) int32 {a := i.(int32)b := i2.(int32)return a - b}r := []rune(ws)switch r[0] {case '高':this.Month = 3case '初':this.Month = 2case '小':this.Month = 1case '六': fallthroughcase '七': fallthroughcase '八': fallthroughcase '九':gradeIndex54 := indexOf(zh_Numbers, r[0], runeCmp)this.Year = year - int32(gradeIndex54-5)this.Month = 2return nildefault:errors.New("Unexpected grade name: " + ws)}gradeIndex := indexOf(zh_Numbers, r[1], runeCmp)if gradeIndex >= 0 {this.Year = year - gradeIndex} else {// 小学 高中 初中if r[1] != '年' {this.Year = 0}}return nil
}func GetMapGradeName2IdByTime(time time.Time) map[string]string {var s = time.Format("2006-01-02 15:04:00")var year, month, day, hour, minute, second int32fmt.Sscanf(s, "%d-%d-%d %d:%d:%d:%d", &year, &month, &day, &hour, &minute, &second)// 每年7月1日0点更新 下半学年(上半年)if month >= 7 {year += 1}a := []string{"高三", "高二", "高一", "初三", "初二", "初一", "小六", "六年级", "七年级", "八年级", "九年级", "高中", "初中", "小学"}m := map[string]string{}for _, e := range a {gmy := GradeMonthYear{}gmy.getByRune(e, year)m[e] = gmy.toString()}return m
}

* converter_test.go

package utilimport ("github.com/magiconair/properties/assert""testing""time"
)func TestConvertGradeChinese2Gradeno(t *testing.T) {now := time.Now()assert.Equal(t, ConvertGradeChinese2Gradeno("高三", now), "03-2016")assert.Equal(t, ConvertGradeChinese2Gradeno("高二", now), "03-2017")assert.Equal(t, ConvertGradeChinese2Gradeno("高一", now), "03-2018")assert.Equal(t, ConvertGradeChinese2Gradeno("初三", now), "02-2016")assert.Equal(t, ConvertGradeChinese2Gradeno("初二", now), "02-2017")assert.Equal(t, ConvertGradeChinese2Gradeno("初一", now), "02-2018")assert.Equal(t, ConvertGradeChinese2Gradeno("小六", now), "01-2013")assert.Equal(t, ConvertGradeChinese2Gradeno("六年级", now), "02-2018")assert.Equal(t, ConvertGradeChinese2Gradeno("七年级", now), "02-2017")assert.Equal(t, ConvertGradeChinese2Gradeno("八年级", now), "02-2016")assert.Equal(t, ConvertGradeChinese2Gradeno("九年级", now), "02-2015")assert.Equal(t, ConvertGradeChinese2Gradeno("高中", now), "03-0000")assert.Equal(t, ConvertGradeChinese2Gradeno("初中", now), "02-0000")assert.Equal(t, ConvertGradeChinese2Gradeno("小学", now), "01-0000")
}func TestGetMapGradeName2IdByTime(t *testing.T) {now := time.Now()gradeMap := GetMapGradeName2IdByTime(now)for k, v := range gradeMap {t.Logf("%s => %s\n", k, v)}}func TestGetMapGradeName2IdByTime_1(t *testing.T) {date := time.Date(2019, 7, 1, 0, 0, 0, 0, time.Local)gradeMap := GetMapGradeName2IdByTime(date)for k, v := range gradeMap {t.Logf("%s => %s\n", k, v)}
}func TestGetMapGradeName2IdByTime_2(t *testing.T) {date := time.Date(2020, 6, 30, 23, 0, 0, 0, time.Local)gradeMap := GetMapGradeName2IdByTime(date)for k, v := range gradeMap {t.Logf("%s => %s\n", k, v)}
}func TestGetMapGradeName2IdByTime_3(t *testing.T) {date := time.Date(2020, 7, 1, 0, 0, 0, 0, time.Local)gradeMap := GetMapGradeName2IdByTime(date)for k, v := range gradeMap {t.Logf("%s => %s\n", k, v)}
}

*  test:

go test -v

=== RUN   TestConvertGradeChinese2Gradeno
--- PASS: TestConvertGradeChinese2Gradeno (0.00s)
=== RUN   TestGetMapGradeName2IdByTime
--- PASS: TestGetMapGradeName2IdByTime (0.00s)converter_test.go:34: 高三 => 03-2016converter_test.go:34: 初一 => 02-2018converter_test.go:34: 八年级 => 02-2016converter_test.go:34: 九年级 => 02-2015converter_test.go:34: 小学 => 01-0000converter_test.go:34: 初三 => 02-2016converter_test.go:34: 高一 => 03-2018converter_test.go:34: 初二 => 02-2017converter_test.go:34: 小六 => 01-2013converter_test.go:34: 七年级 => 02-2017converter_test.go:34: 高二 => 03-2017converter_test.go:34: 六年级 => 02-2018converter_test.go:34: 高中 => 03-0000converter_test.go:34: 初中 => 02-0000
=== RUN   TestGetMapGradeName2IdByTime_1
--- PASS: TestGetMapGradeName2IdByTime_1 (0.00s)converter_test.go:43: 初一 => 02-2019converter_test.go:43: 高二 => 03-2018converter_test.go:43: 小六 => 01-2014converter_test.go:43: 六年级 => 02-2019converter_test.go:43: 八年级 => 02-2017converter_test.go:43: 九年级 => 02-2016converter_test.go:43: 高中 => 03-0000converter_test.go:43: 高三 => 03-2017converter_test.go:43: 七年级 => 02-2018converter_test.go:43: 初中 => 02-0000converter_test.go:43: 初三 => 02-2017converter_test.go:43: 初二 => 02-2018converter_test.go:43: 小学 => 01-0000converter_test.go:43: 高一 => 03-2019
=== RUN   TestGetMapGradeName2IdByTime_2
--- PASS: TestGetMapGradeName2IdByTime_2 (0.00s)converter_test.go:51: 八年级 => 02-2017converter_test.go:51: 初一 => 02-2019converter_test.go:51: 六年级 => 02-2019converter_test.go:51: 九年级 => 02-2016converter_test.go:51: 高三 => 03-2017converter_test.go:51: 初二 => 02-2018converter_test.go:51: 小六 => 01-2014converter_test.go:51: 七年级 => 02-2018converter_test.go:51: 高中 => 03-0000converter_test.go:51: 小学 => 01-0000converter_test.go:51: 高一 => 03-2019converter_test.go:51: 初三 => 02-2017converter_test.go:51: 高二 => 03-2018converter_test.go:51: 初中 => 02-0000
=== RUN   TestGetMapGradeName2IdByTime_3
--- PASS: TestGetMapGradeName2IdByTime_3 (0.00s)converter_test.go:59: 高一 => 03-2020converter_test.go:59: 九年级 => 02-2017converter_test.go:59: 小学 => 01-0000converter_test.go:59: 初一 => 02-2020converter_test.go:59: 八年级 => 02-2018converter_test.go:59: 高中 => 03-0000converter_test.go:59: 初中 => 02-0000converter_test.go:59: 高二 => 03-2019converter_test.go:59: 初三 => 02-2018converter_test.go:59: 小六 => 01-2015converter_test.go:59: 六年级 => 02-2020converter_test.go:59: 七年级 => 02-2019converter_test.go:59: 高三 => 03-2018converter_test.go:59: 初二 => 02-2019
PASSProcess finished with exit code 0

golang 年级转换入学年份相关推荐

  1. golang时间戳转换

    golang时间戳转换 1.获取当前的时间 // unix 时间 fmt.Println(time.Now().Unix())// 格式化 const baseFormat = "2006- ...

  2. Golang二进制转换十进制代码

    为什么80%的码农都做不了架构师?>>>    Golang二进制转换十进制代码,使用 container/list 实现出入栈操作,完成转换. 二进制转十进制的方法是:‍‍从右到左 ...

  3. 学生选课系统-学年学期选择器,根据入学年份自动计算当前学期

    实现效果,一进入自动加载最近学期数据 入学年份是取学号中入学年份对应字段 js //计算学期 function getTerm(no){ //no为学号let date=new Date; //当前时 ...

  4. golang 编码转换 gbk

    (一)golang 官方转换包 go get golang.org/x/text/encoding        https://godoc.org/golang.org/x/text 注:Go里面内 ...

  5. 入学年份 mysql_MySQl的学习1___概述

    1.关系型数据库的管理系统: 比如当前有两张表:学生信息表(学号,姓名,性别,身份证号,学院,专业,入学时间),学生成绩表(学号,科目,成绩)我们可以根据一个学生的学号查找到他的某一学科的成绩,即两张 ...

  6. golang编码转换

    问题:在 Golang 的调试过程中出现中文乱码 原因:Golang 默认不支持 UTF-8 以外的字符集 解决:将字符串的编码转换成UTF-8 首先需要 mahonia 这个包 go get git ...

  7. golang string 转换 uint64_Golang 的 #x27;print#x27; 源码解读

    和其他编程语言一样,Golang也有很多类型的输出方式,这些输出都是通过fmt包来实现的,以下是主要输出方式的源码,路径在fmt/print.go下,源码随简单,理解起来也很容易,阅读理解一遍后记忆更 ...

  8. 入学年份(year)

    包河区2021年信息学竞赛试题 题目描述 Description 随着二胎.三胎的放开,小区里的小宝宝是越来越多了.每个小宝宝到了合适的年龄都会上幼儿园,然后上小学-.根据学籍管理相关规定2021年秋 ...

  9. Golang html转换图片,将HTML转换为图像

    软件需求 以下软件包可用于Windows和Linux系统,并且是完整,有效的解决方案所必需的: gvim - Used to export syntax highlighted source code ...

最新文章

  1. 5G和AI机器人平台
  2. C/C++函数形参传实参时值传递、指针传递、引用传递的区别
  3. 每天一个设计模式,工厂方法模式(Factory Method)
  4. [HDU5215]Cycle
  5. 基于windows10+Anaconda3+Python搭建配置TensorFlow、Keras、Jupyter Notebook库,下载Kaggle狗猫数据集完成原始数据直接训练和数据增强后训练
  6. Python中断多重循环的几种思路exit_flag
  7. 湖南附中模拟day1 瞭望塔
  8. 商城购物车php代码,php网上商城购物车代码一例
  9. android gridview 详解,Android开发 GridView详解
  10. 深入浅出PID控制算法(二)——PID算法离散化和增量式PID算法原理及Matlab实现
  11. linux androidx86双系统,ubuntu下安装RemixOS双系统(Android x86)
  12. 【Linux】虚拟地址空间 --- 虚拟地址、空间布局、内存描述符、写时拷贝、页表…
  13. 微机原理第五章 存储器
  14. [HDCTF2019]bbbbbbrsa
  15. 使用opencv创建一张纯黑色的图片与其他图片进行合成
  16. Office 如何添加Adobe Acrobat虚拟PDF打印机
  17. 我们是“前端offer收割机”
  18. pkcs5 padding和pkcs7 padding的区别
  19. Altium Designer 10 (AD10)制作贴片图
  20. 2010.06.27 可可网络验证系统

热门文章

  1. A类 B类 AB类 D类 K类功放简单对比
  2. html table rownum,Python+Selenium获取HTML-Table表格数据
  3. 【数据库】02 SQL语句
  4. 2021年山东省职业院校技能大赛高职组“信息安全管理与评估”赛项
  5. 基于PHP+MySQL的个性化智能餐饮推荐系统
  6. CODESYS学习手册
  7. Additive equations
  8. C#面向对象的UML工具:StarUML介绍和入门使用
  9. 原始GPS经纬度转换为距离(c/c++)
  10. 二级MySQL,未来教育MySQL题库,15套试卷,sql题答案。