time_date.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package utils
  2. import (
  3. "fmt"
  4. "time"
  5. )
  6. // 日期计算工具
  7. const DateFormatLayout = "2006-01-02"
  8. func TimeDate() string {
  9. return Time().Format(DateFormatLayout)
  10. }
  11. // 期任务格式转化为日任务格式
  12. func PeriodNoToDailyDate(periodNo string) (string, error) {
  13. periodTime, err := time.Parse(PeriodNoFormatLayout, periodNo)
  14. if err != nil {
  15. return "", fmt.Errorf("parse period number failed: %w", err)
  16. }
  17. return periodTime.Format(DateFormatLayout), nil
  18. }
  19. func Today20060102Format() string {
  20. return Time().Format(DateFormatLayout)
  21. }
  22. func ParseDateInLocation(date string) (time.Time, error) {
  23. return time.ParseInLocation(DateFormatLayout, date, loc())
  24. }
  25. // 相隔天数
  26. func CalculateApartDays(beginDate, endDate string) (int, error) {
  27. date1, err := time.Parse("2006-01-02", beginDate)
  28. if err != nil {
  29. return 0, fmt.Errorf("日期解析错误:%s", err)
  30. }
  31. date2, err := time.Parse("2006-01-02", endDate)
  32. if err != nil {
  33. return 0, fmt.Errorf("日期解析错误:%s", err)
  34. }
  35. // 计算天数差
  36. days := int(date2.Sub(date1).Hours() / 24)
  37. return days, nil
  38. }
  39. // 计算相隔月数
  40. func CalculateApartMon(beginDate, endDate string) (int, error) {
  41. date1, err := time.Parse("2006-01-02", beginDate)
  42. if err != nil {
  43. return 0, fmt.Errorf("日期解析错误:%s", err)
  44. }
  45. date2, err := time.Parse("2006-01-02", endDate)
  46. if err != nil {
  47. return 0, fmt.Errorf("日期解析错误:%s", err)
  48. }
  49. months := (date2.Year()-date1.Year())*12 + int(date2.Month()-date1.Month())
  50. // 如果第二个日期的日小于第一个日期的日,则月数减1
  51. if date2.Day() < date1.Day() {
  52. months--
  53. }
  54. return months, nil
  55. }
  56. // 改变指定天数
  57. func ChangeDay(dateStr string, n int) (string, error) {
  58. // 解析日期
  59. date, err := time.Parse("2006-01-02", dateStr)
  60. if err != nil {
  61. return "", fmt.Errorf("日期解析错误:%s", err)
  62. }
  63. // 获取前一天的日期
  64. previousDay := date.AddDate(0, 0, n)
  65. // 格式化为相同的字符串格式
  66. return previousDay.Format("2006-01-02"), nil
  67. }
  68. func AfterOneDay(dateStr string) (string, error) {
  69. // 解析日期
  70. date, err := time.Parse("2006-01-02", dateStr)
  71. if err != nil {
  72. return "", fmt.Errorf("日期解析错误:%s", err)
  73. }
  74. // 获取前一天的日期
  75. previousDay := date.AddDate(0, 0, 1)
  76. // 格式化为相同的字符串格式
  77. return previousDay.Format("2006-01-02"), nil
  78. }
  79. func BeforeDay(dateStr string) (string, error) {
  80. // 解析日期
  81. date, err := time.Parse("2006-01-02", dateStr)
  82. if err != nil {
  83. return "", fmt.Errorf("日期解析错误:%s", err)
  84. }
  85. // 获取前一天的日期
  86. previousDay := date.AddDate(0, 0, -1)
  87. // 格式化为相同的字符串格式
  88. return previousDay.Format("2006-01-02"), nil
  89. }
  90. // 解析日期为TIME对象
  91. func ParseDate(date string) time.Time {
  92. dateTime, err := time.ParseInLocation(DateFormatLayout, date, loc())
  93. if err != nil {
  94. return Time()
  95. }
  96. return dateTime
  97. }