258 lines
10 KiB
Go
258 lines
10 KiB
Go
package datetime
|
||
|
||
import (
|
||
"time"
|
||
)
|
||
|
||
var (
|
||
// Fuseau horaire par défaut
|
||
DefaultTZ = time.Local
|
||
|
||
// 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 l’anné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 l’anné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 l’anné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, // L’identifiant du fuseau horaire (Exemples : UTC, GMT, Atlantic/Azores)
|
||
'I': format_I, // L’heure d’été est activée ou pas (1 si oui, 0 sinon)
|
||
'O': format_O, // Différence d’heures avec l’heure de Greenwich (GMT), sans deux-points entre les heures et les minutes (Exemple : +0200)
|
||
'P': format_P, // Différence d’heures avec l’heure 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 à l’ouest de la zone UTC est négatif, et à l’est, 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)
|
||
}
|
||
|
||
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 d’heures avec l’heure de Greenwich (GMT), sans deux-points entre les heures et les minutes (Exemple : +0200)
|
||
'P': "-07:00", // Différence d’heures avec l’heure 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)
|
||
}
|
||
|
||
layouts = []string{
|
||
DayDateTimeLayout,
|
||
DateTimeLayout, DateTimeNanoLayout, ShortDateTimeLayout, ShortDateTimeNanoLayout,
|
||
DateLayout, DateNanoLayout, ShortDateLayout, ShortDateNanoLayout,
|
||
ISO8601Layout, ISO8601NanoLayout,
|
||
RFC822Layout, RFC822ZLayout, RFC850Layout, RFC1123Layout, RFC1123ZLayout, RFC3339Layout, RFC3339NanoLayout, RFC1036Layout, RFC7231Layout,
|
||
KitchenLayout,
|
||
CookieLayout,
|
||
ANSICLayout,
|
||
UnixDateLayout,
|
||
RubyDateLayout,
|
||
"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.999999999",
|
||
"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.999999999",
|
||
"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.999999999",
|
||
"2006-01-02 15:04:05PM MST", "2006-01-02 15:04:05.999999999PM MST", "2006-1-2 15:4:5PM MST", "2006-1-2 15:4:5.999999999PM MST",
|
||
"2006-01-02 15:04:05 PM MST", "2006-01-02 15:04:05.999999999 PM MST", "2006-1-2 15:4:5 PM MST", "2006-1-2 15:4:5.999999999 PM MST",
|
||
"1/2/2006", "1/2/2006 15", "1/2/2006 15:4", "1/2/2006 15:4:5", "1/2/2006 15:4:5.999999999",
|
||
"2006-1-2 15:4:5 -0700 MST", "2006-1-2 15:4:5.999999999 -0700 MST",
|
||
"2006-1-2T15:4:5Z07", "2006-1-2T15:4:5.999999999Z07",
|
||
"2006-1-2T15:4:5Z07:00", "2006-1-2T15:4:5.999999999Z07:00",
|
||
"2006-1-2T15:4:5-07:00", "2006-1-2T15:4:5.999999999-07:00",
|
||
"20060102150405-07:00", "20060102150405.999999999-07:00",
|
||
"20060102150405Z07", "20060102150405.999999999Z07",
|
||
"20060102150405Z07:00", "20060102150405.999999999Z07:00",
|
||
}
|
||
)
|
||
|
||
const (
|
||
// Unités de durée
|
||
Nanosecond = time.Nanosecond
|
||
Microsecond = time.Microsecond
|
||
Millisecond = time.Millisecond
|
||
Second = time.Second
|
||
Minute = time.Minute
|
||
Hour = time.Hour
|
||
Day = time.Hour * 24
|
||
Week = Day * 7
|
||
|
||
MonthsPerYear = 12
|
||
DaysPerWeek = 7
|
||
HoursPerDay = 24
|
||
HoursPerWeek = HoursPerDay * DaysPerWeek
|
||
MinutesPerHour = 60
|
||
MinutesPerDay = MinutesPerHour * HoursPerDay
|
||
MinutesPerWeek = MinutesPerHour * HoursPerWeek
|
||
SecondsPerMinute = 60
|
||
SecondsPerHour = SecondsPerMinute * MinutesPerHour
|
||
SecondsPerDay = SecondsPerMinute * MinutesPerDay
|
||
SecondsPerWeek = SecondsPerMinute * MinutesPerWeek
|
||
|
||
// Erreurs
|
||
errInvalidTZ = "Invalid timezone %q"
|
||
errInvalidValue = "Cannot parse string %q as datetime, please make sure the value is valid"
|
||
|
||
// Quelques layouts
|
||
ANSICLayout = time.ANSIC
|
||
UnixDateLayout = time.UnixDate
|
||
RubyDateLayout = time.RubyDate
|
||
RFC822Layout = time.RFC822
|
||
RFC822ZLayout = time.RFC822Z
|
||
RFC850Layout = time.RFC850
|
||
RFC1123Layout = time.RFC1123
|
||
RFC1123ZLayout = time.RFC1123Z
|
||
RssLayout = time.RFC1123Z
|
||
KitchenLayout = time.Kitchen
|
||
RFC2822Layout = time.RFC1123Z
|
||
CookieLayout = "Monday, 02-Jan-2006 15:04:05 MST"
|
||
RFC3339Layout = "2006-01-02T15:04:05Z07:00"
|
||
RFC3339MilliLayout = "2006-01-02T15:04:05.999Z07:00"
|
||
RFC3339MicroLayout = "2006-01-02T15:04:05.999999Z07:00"
|
||
RFC3339NanoLayout = "2006-01-02T15:04:05.999999999Z07:00"
|
||
ISO8601Layout = "2006-01-02T15:04:05-07:00"
|
||
ISO8601MilliLayout = "2006-01-02T15:04:05.999-07:00"
|
||
ISO8601MicroLayout = "2006-01-02T15:04:05.999999-07:00"
|
||
ISO8601NanoLayout = "2006-01-02T15:04:05.999999999-07:00"
|
||
RFC1036Layout = "Mon, 02 Jan 06 15:04:05 -0700"
|
||
RFC7231Layout = "Mon, 02 Jan 2006 15:04:05 MST"
|
||
DayDateTimeLayout = "Mon, Jan 2, 2006 3:04 PM"
|
||
DateTimeLayout = "2006-01-02 15:04:05"
|
||
DateTimeMilliLayout = "2006-01-02 15:04:05.999"
|
||
DateTimeMicroLayout = "2006-01-02 15:04:05.999999"
|
||
DateTimeNanoLayout = "2006-01-02 15:04:05.999999999"
|
||
ShortDateTimeLayout = "20060102150405"
|
||
ShortDateTimeMilliLayout = "20060102150405.999"
|
||
ShortDateTimeMicroLayout = "20060102150405.999999"
|
||
ShortDateTimeNanoLayout = "20060102150405.999999999"
|
||
DateLayout = "2006-01-02"
|
||
DateMilliLayout = "2006-01-02.999"
|
||
DateMicroLayout = "2006-01-02.999999"
|
||
DateNanoLayout = "2006-01-02.999999999"
|
||
ShortDateLayout = "20060102"
|
||
ShortDateMilliLayout = "20060102.999"
|
||
ShortDateMicroLayout = "20060102.999999"
|
||
ShortDateNanoLayout = "20060102.999999999"
|
||
TimeLayout = "15:04:05"
|
||
TimeMilliLayout = "15:04:05.999"
|
||
TimeMicroLayout = "15:04:05.999999"
|
||
TimeNanoLayout = "15:04:05.999999999"
|
||
ShortTimeLayout = "150405"
|
||
ShortTimeMilliLayout = "150405.999"
|
||
ShortTimeMicroLayout = "150405.999999"
|
||
ShortTimeNanoLayout = "150405.999999999"
|
||
)
|