-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathdatetime_util.go
329 lines (255 loc) · 8.08 KB
/
datetime_util.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
package utils
import (
"fmt"
"math"
"strconv"
"time"
applog "github.com/lanvige/goutils/logger"
)
// ==================== Format ================== //
// ==================== Format ================== //
// NewDateFromString NewDateFromString
// layout 2006-01-02
func NewDateFromString(value, layout string) (time.Time, error) {
tm, err := time.Parse(layout, value)
if nil != err {
return time.Time{}, err
}
return tm, nil
}
// NewDateFromYearMonthDay NewDateFromYearMonthDay
func NewDateFromYearMonthDay(year, month, day string) (time.Time, error) {
str := fmt.Sprintf("%s-%s-%s", year, month, day)
layout := "2006-01-02"
tm, err := NewDateFromString(str, layout)
if nil != err {
return time.Time{}, err
}
return tm, nil
}
// NewDateUtc8FromYearMonthDay NewUtc8DateFromYearMonthDay
func NewDateUtc8FromYearMonthDay(year, month, day string) (time.Time, error) {
layout := "2006-01-02"
str := fmt.Sprintf("%s-%s-%s", year, month, day)
utc8, err := time.LoadLocation("Asia/Shanghai")
if nil != err {
return time.Time{}, err
}
tm, errParse := time.ParseInLocation(layout, str, utc8)
if nil != errParse {
return time.Time{}, errParse
}
return tm, nil
}
// ==================== Format ================== //
// ==================== Format ================== //
// TimeFormatWithLayout TimeFormatWithLayout
func TimeFormatWithLayout(tm time.Time, layout string) string {
s := tm.Format(layout)
return s
}
// TimeFormatDate 截断日期输出
func TimeFormatDate(tm time.Time) string {
layout := "2006-01-02"
s := TimeFormatWithLayout(tm, layout)
return s
}
// TimeFormatDateTime 截断日期输出
func TimeFormatDateTime(tm time.Time) string {
layout := "2006-01-02 15:04:05"
s := TimeFormatWithLayout(tm, layout)
return s
}
// ==================== 时区转换 ================== //
// ==================== 时区转换 ================== //
// Utc8Lastday 当前服务器时间的东八区昨天日期
// 服务器时区不重要,统一换算为东八区
// 再向前取一天
func Utc8Lastday() time.Time {
var utc8, _ = time.LoadLocation("Asia/Shanghai") //上海
timeUtc8 := time.Now().UTC().In(utc8)
// 对日期减去一天
yesterday := timeUtc8.AddDate(0, 0, -1)
return yesterday
}
// Utc8LastdayString 当前服务器时间的东八区昨天日期
// 服务器时区不重要,统一换算为东八区
// 再向前取一天
func Utc8LastdayString() string {
yesterday := Utc8Lastday()
// 格式化为只有日期
yesString := yesterday.Format("2006-01-02")
return yesString
}
// Utc8Day 当前服务器时间的东八区指定天数日期
// 服务器时区不重要,统一换算为东八区
// 再向前取一天
func Utc8Day(days int) time.Time {
var utc8, _ = time.LoadLocation("Asia/Shanghai") //上海
timeUtc8 := time.Now().UTC().In(utc8)
// 对日期减去一天
day := timeUtc8.AddDate(0, 0, days)
return day
}
// Utc8DayString 当前服务器时间的东八区昨天日期
// 服务器时区不重要,统一换算为东八区
// 再向前取一天
func Utc8DayString(days int) string {
day := Utc8Day(days)
// 格式化为只有日期
dayString := day.Format("2006-01-02")
return dayString
}
// Utc8Today 东八区今天日期
func Utc8Today() time.Time {
var utc8, _ = time.LoadLocation("Asia/Shanghai") //上海
timeUtc8 := time.Now().UTC().In(utc8)
return timeUtc8
}
// Utc8TodayString 东八区今天日期
func Utc8TodayString() string {
timeUtc8 := Utc8Today()
// 格式化为只有日期
todString := timeUtc8.Format("2006-01-02")
return todString
}
// Utc8DuctionDays 一个日期和另一个日期相差多少天
// 要都在东八区算
// 两边都要先算成 0点,因为两边都算整天的
func Utc8DuctionDays(time1, time2 time.Time) int {
// 先换算成 东八区 0点
time10Utc8 := Utc8Day0(time1)
time20Utc8 := Utc8Day0(time2)
applog.Info(time10Utc8.Format("2006-01-02T15:04:05-0700"))
applog.Info(time20Utc8.Format("2006-01-02T15:04:05-0700"))
// 还余多少天
// Sub 计算两个时间差
subM := time20Utc8.Sub(time10Utc8)
remaining := int(math.Floor(subM.Hours() / 24))
applog.Errorf("remaining: %v", remaining)
return remaining
}
// Utc8Day0 把任一时间,换算成东八区0点
func Utc8Day0(time1 time.Time) time.Time {
var utc8, _ = time.LoadLocation("Asia/Shanghai") //上海
timeUtc8 := time.Date(time1.Year(), time1.Month(), time1.Day(), 0, 0, 0, 0, utc8)
return timeUtc8
}
// Utc8Current 取当前时间的 UTC8
func Utc8Current() time.Time {
// 取 Utc0 时间
utc8, _ := time.LoadLocation("Asia/Shanghai")
timeUtc8 := time.Now().In(utc8)
// 按 ISO8601 输出
applog.Info(timeUtc8.Format("2006-01-02T15:04:05-0700"))
return timeUtc8
}
// Utc8Time 取时间的 UTC8
func Utc8Time(tm time.Time) time.Time {
// 取 Utc0 时间
utc8, _ := time.LoadLocation("Asia/Shanghai")
timeUtc0 := tm.In(utc8)
// 按 ISO8601 输出
applog.Info(timeUtc0.Format("2006-01-02T15:04:05-0700"))
return timeUtc0
}
// Utc0Current 取当前时间的 UTC0
func Utc0Current() time.Time {
// 取 Utc0 时间
utc0, _ := time.LoadLocation("UTC")
timeUtc0 := time.Now().In(utc0)
timeUtc02 := time.Now().UTC()
// 按 ISO8601 输出
applog.Info(timeUtc0.Format("2006-01-02T15:04:05-0700"))
applog.Info(timeUtc02.Format("2006-01-02T15:04:05-0700"))
return timeUtc02
}
// Utc0Time 取时间的 UTC0
func Utc0Time(tm time.Time) time.Time {
// 取 Utc0 时间
utc0, _ := time.LoadLocation("UTC")
timeUtc0 := tm.In(utc0)
timeUtc02 := tm.UTC()
// 按 ISO8601 输出
applog.Info(timeUtc0.Format("2006-01-02T15:04:05-0700"))
applog.Info(timeUtc02.Format("2006-01-02T15:04:05-0700"))
return timeUtc02
}
// LocalCurrent LocalCurrent
func LocalCurrent() time.Time {
// 取服务器本地时间,默认就是
utcLocal, _ := time.LoadLocation("Local")
timeLocal := time.Now().In(utcLocal)
// 按 ISO8601 输出
applog.Info(timeLocal.Format("2006-01-02T15:04:05-0700"))
return timeLocal
}
// Time0 取任一时间对应的 0 点
func Time0(time1 time.Time) time.Time {
tm1 := time.Date(time1.Year(), time1.Month(), time1.Day(), 0, 0, 0, 0, time1.Location())
return tm1
}
// Common Common
func Common() {
// 取服务器本地时间,默认就是
utcLocal, _ := time.LoadLocation("Local")
timeUtcLocal := time.Now().In(utcLocal)
// 按 ISO8601 输出
applog.Info(timeUtcLocal.Format("2006-01-02T15:04:05-0700"))
// 取 Utc0 时间
utc0, _ := time.LoadLocation("UTC")
timeUtc0 := time.Now().In(utc0)
timeUtc02 := time.Now().UTC()
// 按 ISO8601 输出
applog.Info(timeUtc0.Format("2006-01-02T15:04:05-0700"))
applog.Info(timeUtc02.Format("2006-01-02T15:04:05-0700"))
// =====
// timeA := time.Now()
// 如何知道这个 time 的时区?
// currentDay := time.Date(timeUtc8.Year(), timeUtc8.Month(), timeUtc8.Day(), 0, 0, 0, 0, timeUtc8.Location())
// =====
// // // 默认UTC
// // loc, err := time.LoadLocation("")
// // // 一般为CST
// // loc, err := time.LoadLocation("Local")
// // // 美国洛杉矶PDT
// // loc, err := time.LoadLocation("America/Los_Angeles")
// // // CST
// // loc, _ := time.LoadLocation("Asia/Chongqing")
// // time.FixedZone("CST", 8*3600) // 东八区时间
// // currentDay := time.Now()
// =====
// applog.Info(currentDay.Format("2006-01-02"))
// applog.Info("start to handle deposit crew!")
// return currentDay
}
// ISO 8601
// Format("2006-01-02T15:04:05-0700")
// 只要日期
// Format("2006-01-02"))
// Format("20060102"))
// 以指定时间开始,设计一个全新的 c_timestamp
// GenCustomTimestamp GenCustomTimestamp
func GenCustomTimestamp() string {
now := time.Now()
dataStr := now.Format("200601021504")
nanosec := now.Nanosecond()
nanosecStr := strconv.Itoa(nanosec)
microsecStr := nanosecStr[0:3]
rdmStr := GenRandomNumString(4)
// applog.Error(dataStr)
// applog.Errorf("microsecStr:%v", microsecStr)
// applog.Errorf("micrrdmStrosecStr:%v", rdmStr)
str := dataStr + microsecStr + rdmStr
return str
}
// ParseTimeNano ParseTimeNano
func ParseTimeNano(value string, defaultValue time.Time) time.Time {
// layout := "2019-07-19T02:53:32.441909288Z"
t, err := time.Parse(time.RFC3339Nano, value)
if err != nil {
// applog.Error(err)
return defaultValue
}
return t
}