package date_utils import ( "strconv" "time" ) const TimeZoneString = "Africa/Johannesburg" func DateLayoutYearMonthDayTimeT() string { layout := "2006-01-02T15:04:05" return layout } func DateLayoutYearMonthDayTimeTZ() string { layout := "2006-01-02T15:04:05Z" return layout } func DateLayoutYearMonthDayTimeMillisecondTZ() string { layout := "2006-01-02T15:04:05.000Z" return layout } func DateLayoutDB() string { return "2006-01-02 15:04:05.000000-07" } func DateLayoutYearMonthDayTimeTimezone() string { layout := "2006-01-02 15:04:05-07:00" return layout } func DateLayoutForDB() string { layout := "2006-01-02 15:04:05-07" return layout } func DateLayoutYearMonthDayTime() string { layout := "2006-01-02 15:04:05" return layout } func DateLayoutFilenameSafe() string { layout := "2006-01-02(15h04s05)" return layout } func DateLayoutYearMonthDay() string { layout := "2006-01-02" return layout } func DateLayoutTime() string { layout := "15:04:05" return layout } func DateLayoutHumanReadable() string { layout := "02 Jan 2006" return layout } func DateLayoutTrimmed() string { layout := "20060102150405" return layout } func DateDBFormattedString(date time.Time) string { return date.Format(DateLayoutDB()) } func DateDBFormattedStringDateOnly(date time.Time) string { return date.Format(DateLayoutYearMonthDay()) } func CurrentLocation() *time.Location { loc, _ := time.LoadLocation(TimeZoneString) return loc } func DateLocal(date *time.Time) { if date == nil { return } *date = (*date).In(CurrentLocation()) } func CurrentDate() time.Time { currentDate := time.Now().In(CurrentLocation()) return currentDate } func DateEqual(date1, date2 time.Time) bool { y1, m1, d1 := date1.Date() y2, m2, d2 := date2.Date() return y1 == y2 && m1 == m2 && d1 == d2 } // TimeBefore determines whether a (string format HH:mm) is earlier than b (string format HH:mm) func TimeBefore(a string, b string) bool { if len(a) < 5 || len(b) < 5 { return false // can't detemrine before/after } hoursA, _ := strconv.Atoi(a[0:2]) hoursB, _ := strconv.Atoi(b[0:2]) minA, _ := strconv.Atoi(a[3:5]) minB, _ := strconv.Atoi(b[3:5]) if hoursA == hoursB { return minA < minB } return hoursA < hoursB } // ConvertToNoDateTimeString - Converts a PSQL Time type to Go Time type func ConvertToNoDateTimeString(timeString *string) (*string, error) { parsedTime, err := time.Parse("15:04:05", *timeString) if err != nil { return nil, err } formattedTime := parsedTime.Format("15:04") return &formattedTime, nil } // ParseTimeString attempts to parse the string as the default date-time format, or as a date only format func ParseTimeString(timeString string) (time.Time, error) { // Try using the default format parsedTime, err := time.Parse(DateLayoutYearMonthDayTimeMillisecondTZ(), timeString) if err != nil { // Try using date only format parsedTime, err = time.Parse(DateLayoutYearMonthDay(), timeString) } return parsedTime, err }