mirror of
https://github.com/dancojocaru2000/CfrTrainInfoTelegramBot.git
synced 2025-02-22 17:19:39 +02:00
56 lines
1.4 KiB
Go
56 lines
1.4 KiB
Go
package utils
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
var (
|
|
InvalidDateFormat = fmt.Errorf("invalid date format")
|
|
)
|
|
|
|
func ParseDate(input string) (time.Time, error) {
|
|
if strings.Contains(input, "-") {
|
|
return parse3Part(input, "-", 0, 1, 2)
|
|
} else if strings.Contains(input, "/") {
|
|
return parse3Part(input, "/", 2, 0, 1)
|
|
} else if strings.Contains(input, ".") {
|
|
return parse3Part(input, ".", 2, 1, 0)
|
|
} else {
|
|
parsed, err := strconv.ParseInt(input, 10, 63)
|
|
if err != nil {
|
|
return time.Time{}, err
|
|
}
|
|
return time.Unix(parsed, 0), nil
|
|
}
|
|
}
|
|
|
|
func parse3Part(input string, sep string, yearIndex int, monthIndex int, dayIndex int) (time.Time, error) {
|
|
splitted := strings.Split(input, sep)
|
|
if len(splitted) == 2 && yearIndex == 2 {
|
|
// If the year is the last part of the format, allow omitting it
|
|
splitted = append(splitted, fmt.Sprintf("%d", time.Now().Year()))
|
|
}
|
|
if len(splitted) != 3 {
|
|
return time.Time{}, InvalidDateFormat
|
|
}
|
|
year, err := strconv.Atoi(splitted[yearIndex])
|
|
if err != nil {
|
|
return time.Time{}, InvalidDateFormat
|
|
}
|
|
if year < 100 {
|
|
// Assume xx.xx.23 or x/x/23 => 2023
|
|
year = (time.Now().Year() / 100 * 100) + year
|
|
}
|
|
month, err := strconv.Atoi(splitted[monthIndex])
|
|
if err != nil {
|
|
return time.Time{}, InvalidDateFormat
|
|
}
|
|
day, err := strconv.Atoi(splitted[dayIndex])
|
|
if err != nil {
|
|
return time.Time{}, InvalidDateFormat
|
|
}
|
|
return time.Date(year, time.Month(month), day, 12, 0, 0, 0, Location), nil
|
|
}
|