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"
|
|||
|
)
|