gob/datetime/const.go

357 lines
11 KiB
Go
Raw Normal View History

2023-10-31 10:18:00 +00:00
package datetime
import (
"time"
)
2023-11-03 19:33:26 +00:00
const (
// Conversions dunités.
NanosecondPerMicrosecond = 1000
MicrosecondPerMillisecond = 1000
MillisecondPerSecond = 1000
SecondPerMinute = 60
MinutePerHour = 60
HourPerDay = 24
DayPerWeek = 7
MonthPerYear = 12
BeatPerDay = 1000
HourPerWeek = HourPerDay * DayPerWeek
MinutePerDay = MinutePerHour * HourPerDay
MinutePerWeek = MinutePerHour * HourPerWeek
SecondPerHour = SecondPerMinute * MinutePerHour
SecondPerDay = SecondPerMinute * MinutePerDay
SecondPerWeek = SecondPerMinute * MinutePerWeek
MillisecondPerMinute = MillisecondPerSecond * SecondPerMinute
MillisecondPerHour = MillisecondPerSecond * SecondPerHour
MillisecondPerDay = MillisecondPerSecond * SecondPerDay
MillisecondPerWeek = MillisecondPerSecond * SecondPerWeek
MicrosecondPerSecond = MicrosecondPerMillisecond * MillisecondPerSecond
NanosecondPerMillisecond = NanosecondPerMicrosecond * MicrosecondPerMillisecond
NanosecondPerSecond = NanosecondPerMicrosecond * MicrosecondPerSecond
// Unités supportées
NoUnit Unit = iota
Millisecond
Second
Minute
Hour
Day
Week
Month
Year
// Durée nulle
DurationNil = Duration(0)
bitsUnit = Duration(4)
bitsValue = 64 - bitsUnit
maskUnit = 1<<bitsUnit - 1
maskValue = ^maskUnit
// Précisions supportées
NoPrecision Precision = iota
PrecisionMillisecond
PrecisionSecond
PrecisionMinute
bitsPrecision = uint32(2)
maskPrecision = 1<<bitsPrecision - 1
maskMillisecond = ^maskPrecision
minClock = uint(0)
maxClock = uint(MillisecondPerDay - 1)
clockNil = clock(0)
bitsDay = 5
bitsMonth = 4
shiftDay = date(0)
shiftMonth = date(bitsDay)
shiftYear = date(bitsDay + bitsMonth)
maskDay = 1<<bitsDay - 1
maskMonth = (1<<bitsMonth - 1) << shiftMonth
maskYear = ^(maskDay | maskMonth)
dateNil = date(0)
// Mois
January = uint(1) + iota
February
March
April
May
June
July
August
September
October
November
December
// Jours de la semaine
Sunday = uint(iota)
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
)
2023-10-31 10:18:00 +00:00
var (
// Représentation de lunité sous forme de caractères
unitToString = map[Unit]string{
NoUnit: "",
Millisecond: "ms",
Second: "s",
Minute: "m",
Hour: "h",
Day: "J",
Week: "S",
Month: "M",
Year: "A",
2023-11-03 19:33:26 +00:00
}
maskDate = map[string]date{
"d": maskDay,
"m": maskMonth,
"y": maskYear,
}
shiftDate = map[string]date{
"d": shiftDay,
"m": shiftMonth,
"y": shiftYear,
}
beginPrecisionM = map[Precision][]uint{
PrecisionMillisecond: []uint{0},
}
endPrecisionM = map[Precision][]uint{
PrecisionMillisecond: []uint{999},
}
beginPrecisionS = map[Precision][]uint{
PrecisionSecond: []uint{0},
PrecisionMillisecond: []uint{0, 0},
}
endPrecisionS = map[Precision][]uint{
PrecisionSecond: []uint{999},
PrecisionMillisecond: []uint{59, 999},
}
// Layouts de base pour le parsage des dates
layouts = []string{
"Mon, Jan 2, 2006 3:04 PM",
"2006-01-02 15:04:05", "2006-01-02 15:04:05.999", "20060102150405", "20060102150405.999",
"2006-01-02", "2006-01-02.999", "20060102", "20060102.999",
// ISO8601
"2006-01-02T15:04:05-07:00", "2006-01-02T15:04:05.999-07:00",
// RFC822
"02 Jan 06 15:04 MST", "02 Jan 06 15:04 -0700",
// RFC850
"Monday, 02-Jan-06 15:04:05 MST",
// RFC1123
"Mon, 02 Jan 2006 15:04:05 MST", "Mon, 02 Jan 2006 15:04:05 -0700",
// RFC3339
"2006-01-02T15:04:05Z07:00", "2006-01-02T15:04:05.999999999Z07:00",
// RFC1036
"Mon, 02 Jan 06 15:04:05 -0700",
// RFC7231
"Mon, 02 Jan 2006 15:04:05 MST",
"3:04PM",
// Cookies
"Monday, 02-Jan-2006 15:04:05 MST",
// ANSIC
"Mon Jan _2 15:04:05 2006",
// UNIX
"Mon Jan _2 15:04:05 MST 2006",
// Ruby
"Mon Jan 02 15:04:05 -0700 2006",
"2006",
"2006-1", "2006-1-2", "2006-1-2 15", "2006-1-2 15:4", "2006-1-2 15:4:5", "2006-1-2 15:4:5.999",
"2006.1", "2006.1.2", "2006.1.2 15", "2006.1.2 15:4", "2006.1.2 15:4:5", "2006.1.2 15:4:5.999",
"2006/1", "2006/1/2", "2006/1/2 15", "2006/1/2 15:4", "2006/1/2 15:4:5", "2006/1/2 15:4:5.999",
"2006-01", "2006-01-02", "2006-01-02 15", "2006-01-02 15:04", "2006-01-02 15:04:05", "2006-01-02 15:04:05.999",
"2006.01", "2006.01.02", "2006.01.02 15", "2006.01.02 15:04", "2006.01.02 15:04:05", "2006.01.02 15:04:05.999",
"2006/01", "2006/01/02", "2006/01/02 15", "2006/01/02 15:04", "2006/01/02 15:04:05", "2006/01/02 15:04:05.999",
"2006-01-02 15:04:05PM MST", "2006-01-02 15:04:05.999PM MST", "2006-1-2 15:4:5PM MST", "2006-1-2 15:4:5.999PM MST",
"2006-01-02 15:04:05 PM MST", "2006-01-02 15:04:05.999 PM MST", "2006-1-2 15:4:5 PM MST", "2006-1-2 15:4:5.999 PM MST",
"2/1/2006", "2/1/2006 15", "2/1/2006 15:4", "2/1/2006 15:4:5", "2/1/2006 15:4:5.999",
"02/01/2006", "02/01/2006 15", "02/01/2006 15:04", "02/01/2006 15:04:05", "02/01/2006 15:04:05.999",
"2006-1-2 15:4:5 -0700 MST", "2006-1-2 15:4:5.999 -0700 MST",
"2006-1-2T15:4:5Z07", "2006-1-2T15:4:5.999Z07",
"2006-1-2T15:4:5Z07:00", "2006-1-2T15:4:5.999Z07:00",
"2006-1-2T15:4:5-07:00", "2006-1-2T15:4:5.999-07:00",
"20060102150405-07:00", "20060102150405.999-07:00",
"20060102150405Z07", "20060102150405.999Z07",
"20060102150405Z07:00", "20060102150405.999Z07:00",
}
// Conversion parsage → layout
parsers = map[rune]string{
// Jours
'j': "2", // Jour du mois sans les 0 initiaux (1-31)
'd': "02", // Jour du mois, sur deux chiffres (avec un 0 initial) (01-31)
'D': "Mon", // Jour de la semaine, en 3 lettres (Mon-Sun)
'l': "Monday", // Jour de la semaine, textuel, version longue (Monday-Sunday)
// Mois
'n': "1", // Mois sans les 0 initiaux (1-12)
'm': "01", // Mois au format numérique, avec 0 initiaux (01-12)
'M': "Jan", // Mois, en trois lettres (Jan-Dec)
'F': "January", // Mois, textuel, version longue (January-December)
// Année
'y': "06", // Année sur 2 chiffres (Exemples : 99 ou 03)
'Y': "2006", // Année sur au moins 4 chiffres, avec - pour les années av. J.-C. (Exemples : -0055, 0787, 1999, 2003, 10191)
// Heure
'a': "pm", // Ante meridiem et Post meridiem en minuscules (am ou pm)
'A': "PM", // Ante meridiem et Post meridiem en majuscules (AM ou PM)
'g': "3", // Heure, au format 12h, sans les 0 initiaux (1-12)
'h': "03", // Heure, au format 12h, avec les 0 initiaux (01-12)
'H': "15", // Heure, au format 24h, avec les 0 initiaux (00-23)
'i': "04", // Minutes avec les 0 initiaux (00-59)
's': "05", // Secondes avec les 0 initiaux (00-59)
// Fuseau horaire
'T': "MST", // Abréviation du fuseau horaire, si connu; sinon décalage depuis GMT (Exemples : EST, MDT, +05)
'O': "-0700", // Différence dheures avec lheure de Greenwich (GMT), sans deux-points entre les heures et les minutes (Exemple : +0200)
'P': "-07:00", // Différence dheures avec lheure de Greenwich (GMT), avec deux-points entre les heures et les minutes (Exemple : +02:00)
// Date et heure complète
'c': "2006-01-02T15:04:05-07:00", // Date au format ISO 8601 (2004-02-12T15:19:21+00:00)
'r': "Thu, 21 Dec 2000 16:01:07 +0200", // Date au format RFC 5322 (Thu, 21 Dec 2000 16:01:070200)
}
2023-10-31 10:18:00 +00:00
// Jours de la semaine (format court)
shortDays = []string{
"Sun",
"Mon",
"Tue",
"Wed",
"Thu",
"Fri",
"Sat",
}
// Jours de la semaine (format long)
longDays = []string{
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
}
// Mois (format court)
shortMonths = []string{
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec",
}
// Mois (format long)
longMonths = []string{
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December",
}
formatters = map[rune]func(time.Time) string{
// Jour
'j': format_j, // Jour du mois sans les 0 initiaux (1-31)
'd': format_d, // Jour du mois, sur deux chiffres (avec un 0 initial) (01-31)
'N': format_N, // Représentation numérique ISO 8601 du jour de la semaine (1-7)
'w': format_w, // Jour de la semaine au format numérique (0-6)
'z': format_z, // Jour de lannée (0-365)
'D': format_D, // Jour de la semaine, en 3 lettres (Mon-Sun)
'l': format_l, // Jour de la semaine, textuel, version longue (Monday-Sunday)
// Semaine
'W': format_W, // N° de semaine dans lannée ISO 8601, les semaines commencent le lundi (0-53)
// Mois
'n': format_n, // Mois sans les 0 initiaux (1-12)
'm': format_m, // Mois au format numérique, avec 0 initiaux (01-12)
't': format_t, // Nombre de jours dans le mois (28-31)
'M': format_M, // Mois, en trois lettres (Jan-Dec)
'F': format_F, // Mois, textuel, version longue (January-December)
// Année
'y': format_y, // Année sur 2 chiffres (Exemples : 99 ou 03)
'Y': format_Y, // Année sur au moins 4 chiffres, avec - pour les années av. J.-C. (Exemples : -0055, 0787, 1999, 2003, 10191)
'L': format_L, // Est ce que lannée est bissextile (1 si bissextile, 0 sinon)
// Heure
'a': format_a, // Ante meridiem et Post meridiem en minuscules (am ou pm)
'A': format_A, // Ante meridiem et Post meridiem en majuscules (AM ou PM)
'B': format_B, // Heure Internet Swatch (000-999)
'g': format_g, // Heure, au format 12h, sans les 0 initiaux (1-12)
'G': format_G, // Heure, au format 24h, sans les 0 initiaux (0-23)
'h': format_h, // Heure, au format 12h, avec les 0 initiaux (01-12)
'H': format_H, // Heure, au format 24h, avec les 0 initiaux (00-23)
'i': format_i, // Minutes avec les 0 initiaux (00-59)
's': format_s, // Secondes avec les 0 initiaux (00-59)
'v': format_v, // Nillisecondes avec les 0 initiaux (000-999)
'u': format_u, // Microsecondes avec les 0 initiaux (000000-999999)
// Fuseau horaire
'T': format_T, // Abréviation du fuseau horaire, si connu; sinon décalage depuis GMT (Exemples : EST, MDT, +05)
'e': format_e, // Lidentifiant du fuseau horaire (Exemples : UTC, GMT, Atlantic/Azores)
'I': format_I, // Lheure dété est activée ou pas (1 si oui, 0 sinon)
'O': format_O, // Différence dheures avec lheure de Greenwich (GMT), sans deux-points entre les heures et les minutes (Exemple : +0200)
'P': format_P, // Différence dheures avec lheure de Greenwich (GMT), avec deux-points entre les heures et les minutes (Exemple : +02:00)
'p': format_p, // Identique à P, mais retourne Z au lieu de +00:00
'Z': format_Z, // Décalage horaire en secondes. Le décalage des zones à louest de la zone UTC est négatif, et à lest, il est positif.(-43200 à 50400)
// Date et heure complète
'c': format_c, // Date au format ISO 8601 (2004-02-12T15:19:21+00:00)
'r': format_r, // Date au format RFC 5322 (Thu, 21 Dec 2000 16:01:070200)
'U': format_U, // Secondes depuis lépoque Unix (1er Janvier 1970, 0h00 00s GMT)
}
2023-11-03 19:33:26 +00:00
amPmLow = map[bool]string{
true: "am",
false: "pm",
}
2023-10-31 10:18:00 +00:00
2023-11-03 19:33:26 +00:00
amPmUp = map[bool]string{
true: "AM",
false: "PM",
2023-10-31 10:18:00 +00:00
}
2023-11-03 19:33:26 +00:00
formatP = map[Precision]string{
PrecisionMinute: "H:iT",
PrecisionSecond: "H:i:sT",
PrecisionMillisecond: "H:i:s.vT",
2023-10-31 10:18:00 +00:00
}
2023-11-03 19:33:26 +00:00
// Fuseau horaire par défaut
DefaultTZ = time.Local
2023-10-31 10:18:00 +00:00
)