Skip to content

Commit d1bdf48

Browse files
committed
Add features
Add utilities Add Unix method to fetch Unix time as int64
1 parent 491bbff commit d1bdf48

5 files changed

Lines changed: 141 additions & 1 deletion

File tree

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
.gitignore
2+
.idea/

go.mod

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
11
module github.com/codebyzen/lotime
22

3+
//retract v0.0.6
4+
//retract v0.0.4
5+
36
go 1.21

loctime.go

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ func SetGlobalTimeZone(name string) error {
2828
return nil
2929
}
3030

31+
func Date(year int, month time.Month, day, hour, minute, second, nSecond int) time.Time {
32+
return time.Date(year, month, day, hour, minute, second, nSecond, globalLocation)
33+
}
34+
3135
// SetFixedTimeZone set timezone to fixed value with specified hours offset
3236
func SetFixedTimeZone(name string, hours int) {
3337
loc := time.FixedZone(name, hours*60*60)
@@ -50,13 +54,45 @@ func Now() time.Time {
5054
return time.Now().In(globalLocation)
5155
}
5256

53-
// Parse parse date string in global timezone
57+
// Parse date string in global timezone
58+
//
59+
// Year: "2006" "06"
60+
// Month: "Jan" "January" "01" "1"
61+
// Day of the week: "Mon" "Monday"
62+
// Day of the month: "2" "_2" "02"
63+
// Day of the year: "__2" "002"
64+
// Hour: "15" "3" "03" (PM or AM)
65+
// Minute: "4" "04"
66+
// Second: "5" "05"
67+
// AM/PM mark: "PM"
68+
//
69+
// Numeric time zone offsets format as follows:
70+
//
71+
// "-0700" ±hhmm
72+
// "-07:00" ±hh:mm
73+
// "-07" ±hh
74+
// "-070000" ±hhmmss
75+
// "-07:00:00" ±hh:mm:ss
76+
//
77+
// Replacing the sign in the format with a Z triggers
78+
// the ISO 8601 behavior of printing Z instead of an
79+
// offset for the UTC zone. Thus:
80+
//
81+
// "Z0700" Z or ±hhmm
82+
// "Z07:00" Z or ±hh:mm
83+
// "Z07" Z or ±hh
84+
// "Z070000" Z or ±hhmmss
85+
// "Z07:00:00" Z or ±hh:mm:ss
5486
func Parse(layout, value string) (time.Time, error) {
5587
mu.RLock()
5688
defer mu.RUnlock()
5789
return time.ParseInLocation(layout, value, globalLocation)
5890
}
5991

92+
func Unix() int64 {
93+
return int64(Now().UnixNano() / 1e9)
94+
}
95+
6096
// Location return current timezone
6197
func Location() *time.Location {
6298
mu.RLock()

loctime_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
package lotime

utils.go

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
package lotime
2+
3+
import (
4+
"fmt"
5+
"time"
6+
)
7+
8+
// GetWeekOfMonth returns the week number as int in month by date
9+
func GetWeekOfMonth(dt time.Time, isFirstDayMon bool) int {
10+
// Get the first day of the month
11+
firstDayOfMonth := time.Date(dt.Year(), dt.Month(), 1, 0, 0, 0, 0, dt.Location())
12+
13+
// Get offset for first weekday
14+
adjustedWeekday := 0
15+
if isFirstDayMon {
16+
adjustedWeekday = (int(firstDayOfMonth.Weekday()) + 6) % 7
17+
}
18+
19+
// Day of month
20+
dayOfMonth := dt.Day()
21+
22+
// Calculate adjusted day
23+
adjustedDay := dayOfMonth + adjustedWeekday - 1
24+
25+
// Calculate week number
26+
return (adjustedDay / 7) + 1
27+
}
28+
29+
// GetDayOfYear return day of year by date
30+
func GetDayOfYear(year int, month int, day int) int {
31+
monthName := time.Month(month)
32+
date := time.Date(year, monthName, day, 0, 0, 0, 0, time.UTC)
33+
return date.YearDay()
34+
}
35+
36+
// DateIsPassedInCurrentYear Проверяем, прошла ли дата в текущем году
37+
func DateIsPassedInCurrentYear(dt time.Time) bool {
38+
now := time.Now().Local()
39+
40+
date := time.Date(now.Year(), dt.Month(), dt.Day(), 0, 0, 0, 0, time.Local)
41+
42+
if now.After(date) {
43+
return true
44+
}
45+
return false
46+
}
47+
48+
// DateYearsSince Amount of years since the given date
49+
func DateYearsSince(dt time.Time) int {
50+
now := time.Now()
51+
52+
years := now.Year() - dt.Year()
53+
54+
// If current date is before dt by day or month, then year is not complete
55+
if now.Month() < dt.Month() || (now.Month() == dt.Month() && now.Day() < dt.Day()) {
56+
years--
57+
}
58+
59+
return years
60+
}
61+
62+
// NthOrLastWeekdayOfMonth Calculate the nth or last weekday of a given month and year.
63+
func NthOrLastWeekdayOfMonth(year int, month time.Month, userWeekday int, weekNum int, isFirstDayMon bool) (time.Time, error) {
64+
if userWeekday < 1 || userWeekday > 7 {
65+
return time.Time{}, fmt.Errorf("invalid weekday: %d", userWeekday)
66+
}
67+
if weekNum < 0 || weekNum > 5 {
68+
return time.Time{}, fmt.Errorf("invalid week number: %d", weekNum)
69+
}
70+
71+
targetWeekday := time.Weekday(0)
72+
if isFirstDayMon {
73+
targetWeekday = time.Weekday(userWeekday % 7) // Sunday=0 ... Saturday=6
74+
}
75+
76+
if weekNum == 0 {
77+
// Search for the last weekday of the month
78+
firstOfNextMonth := time.Date(year, month+1, 1, 0, 0, 0, 0, time.UTC)
79+
lastDayOfMonth := firstOfNextMonth.AddDate(0, 0, -1)
80+
81+
for lastDayOfMonth.Weekday() != targetWeekday {
82+
lastDayOfMonth = lastDayOfMonth.AddDate(0, 0, -1)
83+
}
84+
return lastDayOfMonth, nil
85+
}
86+
87+
// Search for the nth weekday of the month
88+
firstOfMonth := time.Date(year, month, 1, 0, 0, 0, 0, time.UTC)
89+
offset := (int(targetWeekday) - int(firstOfMonth.Weekday()) + 7) % 7
90+
day := 1 + offset + (weekNum-1)*7
91+
92+
// Check if the date is valid
93+
if day > 31 || time.Date(year, month, day, 0, 0, 0, 0, time.UTC).Month() != month {
94+
return time.Time{}, fmt.Errorf("no such weekday occurrence in this month")
95+
}
96+
97+
return time.Date(year, month, day, 0, 0, 0, 0, time.UTC), nil
98+
}

0 commit comments

Comments
 (0)