github.com/alibabacloud-go/tea@v1.3.10/dara/date.go (about) 1 package dara 2 3 import ( 4 "fmt" 5 "strings" 6 "time" 7 ) 8 9 type Date struct { 10 date time.Time 11 } 12 13 func NewDate(dateInput string) (*Date, error) { 14 var t time.Time 15 var err error 16 // 解析输入时间,如果输入格式不对,返回错误 17 formats := []string{ 18 "2006-01-02 15:04:05", 19 "2006-01-02 15:04:05.999999999 -0700 MST", 20 "2006-01-02T15:04:05-07:00", 21 "2006-01-02T15:04:05Z", 22 } 23 24 for _, format := range formats { 25 t, err = time.Parse(format, dateInput) 26 if err == nil { 27 return &Date{date: t}, nil 28 } 29 } 30 31 return nil, fmt.Errorf("unable to parse date: %v", dateInput) 32 } 33 34 func (t *Date) Format(layout string) string { 35 36 layout = strings.Replace(layout, "yyyy", "2006", 1) 37 layout = strings.Replace(layout, "MM", "01", 1) 38 layout = strings.Replace(layout, "dd", "02", 1) 39 // layout = strings.Replace(layout, "HH", "15", 1) 40 layout = strings.Replace(layout, "hh", "15", 1) 41 layout = strings.Replace(layout, "mm", "04", 1) 42 layout = strings.Replace(layout, "ss", "05", 1) 43 layout = strings.Replace(layout, "a", "PM", 1) 44 layout = strings.Replace(layout, "EEEE", "Monday", 1) 45 layout = strings.Replace(layout, "E", "Mon", 1) 46 return t.date.Format(layout) 47 } 48 49 func (t *Date) Unix() int64 { 50 return t.date.Unix() 51 } 52 53 func (t *Date) UTC() string { 54 return t.date.UTC().Format("2006-01-02 15:04:05.000000000 -0700 MST") 55 } 56 57 func (t *Date) Sub(amount int, unit string) *Date { 58 var duration time.Duration 59 switch unit { 60 case "second", "seconds": 61 duration = time.Duration(-amount) * time.Second 62 case "minute", "minutes": 63 duration = time.Duration(-amount) * time.Minute 64 case "hour", "hours": 65 duration = time.Duration(-amount) * time.Hour 66 case "day", "days": 67 duration = time.Duration(-amount) * 24 * time.Hour 68 case "week", "weeks": 69 duration = time.Duration(-amount) * 7 * 24 * time.Hour 70 case "month", "months": 71 return &Date{date: t.date.AddDate(0, -amount, 0)} 72 case "year", "years": 73 return &Date{date: t.date.AddDate(-amount, 0, 0)} 74 default: 75 return nil 76 } 77 newDate := t.date.Add(duration) 78 return &Date{date: newDate} 79 } 80 81 func (t *Date) Add(amount int, unit string) *Date { 82 var duration time.Duration 83 switch unit { 84 case "second", "seconds": 85 duration = time.Duration(amount) * time.Second 86 case "minute", "minutes": 87 duration = time.Duration(amount) * time.Minute 88 case "hour", "hours": 89 duration = time.Duration(amount) * time.Hour 90 case "day", "days": 91 duration = time.Duration(amount) * 24 * time.Hour 92 case "week", "weeks": 93 duration = time.Duration(amount) * 7 * 24 * time.Hour 94 case "month", "months": 95 return &Date{date: t.date.AddDate(0, amount, 0)} 96 case "year", "years": 97 return &Date{date: t.date.AddDate(amount, 0, 0)} 98 default: 99 return nil 100 } 101 102 newDate := t.date.Add(duration) 103 return &Date{date: newDate} 104 } 105 106 func (t *Date) Diff(amount string, diffDate *Date) int64 { 107 switch amount { 108 case "second", "seconds": 109 return int64(t.date.Sub(diffDate.date).Seconds()) 110 case "minute", "minutes": 111 return int64(t.date.Sub(diffDate.date).Minutes()) 112 case "hour", "hours": 113 return int64(t.date.Sub(diffDate.date).Hours()) 114 case "day", "days": 115 return int64(t.date.Sub(diffDate.date).Hours() / 24) 116 case "week", "weeks": 117 return int64(t.date.Sub(diffDate.date).Hours() / (24 * 7)) 118 case "month", "months": 119 return int64(diffDate.date.Year()*12 + int(diffDate.date.Month()) - (t.date.Year()*12 + int(t.date.Month()))) 120 case "year", "years": 121 return int64(t.date.Year() - diffDate.date.Year()) 122 default: 123 return 0 124 } 125 } 126 127 func (t *Date) Hour() int { 128 return t.date.Hour() 129 } 130 131 func (t *Date) Minute() int { 132 return t.date.Minute() 133 } 134 135 func (t *Date) Second() int { 136 return t.date.Second() 137 } 138 139 func (t *Date) Month() int { 140 return int(t.date.Month()) 141 } 142 143 func (t *Date) Year() int { 144 return t.date.Year() 145 } 146 147 func (t *Date) DayOfMonth() int { 148 return t.date.Day() 149 } 150 151 func (t *Date) DayOfWeek() int { 152 weekday := int(t.date.Weekday()) 153 if weekday == 0 { 154 return 7 // Sunday 155 } 156 return weekday 157 } 158 159 func (t *Date) WeekOfYear() int { 160 _, week := t.date.ISOWeek() 161 return week 162 }