DateTime

De Banane Atomic
Aller à la navigationAller à la recherche

DateTime et String

Csharp.svg
var formattedDate = $"{DateTime.Now:yyyy-MM-dd}";

dateTime.ToString("o");
DateTime dt = DateTime.ParseExact(dateTimeString, "o", DateTimeFormatInfo.CurrentInfo);

// RoundtripKind permet de conserver la valeur de la propriété Kind lors de la convertion. Par défaut Kind est définit à Local.
DateTime.Parse(stringToParse, null, DateTimeStyles.RoundtripKind);

dateTimeOffset.ToString("dd MMM yyyy – HH:mm:ss:fffffff", CultureInfo.InvariantCulture);
DateTimeOffset.ParseExact(stringToParse, "dd MMM yyyy - HH:mm:ss:fffffff zzz", CultureInfo.InvariantCulture);

dateTimeOffset.ToString("o"); // équivalent à 
dateTimeOffset.ToString("yyyy-MM-ddTHH:mm:ss.fffffffzzz", CultureInfo.InvariantCulture);
DateTimeOffset.Parse(stringToParse);

Formats Standard

Nom Code Affichage
ShortDate d 3/9/2008
LongDate D Sunday, March 09, 2008
MonthDay m March 09
YearMonth y March, 2008
ShortTime t 4:05 PM
LongTime T 4:05:07 PM
ShortDate+ShortTime g 3/9/2008 4:05 PM
ShortDate+LongTime G 3/9/2008 4:05:07 PM
LongDate+ShortTime f Sunday, March 09, 2008 4:05 PM
FullDateTime F Sunday, March 09, 2008 4:05:07 PM
RFC1123 r Sun, 09 Mar 2008 16:05:07 GMT
SortableDateTime s 2008-03-09T16:05:07
UniversalSortableDateTime u 2008-03-09 16:05:07Z
o 2008-03-09T16:05:07.1234567+01:00

Formats personnalisés

d 1     yyyy 2015
dd 01 HH 23
ddd lun. mm 59
dddd lundi ss 59
M 1 fff 123
MM 01 zzz -07:00
MMM janv.
MMMM janvier

DateTime et Culture

Si elle n'est pas spécifiée c'est la culture courante (CultureInfo.CurrentCulture) qui est utilisée.
Si l'on utilise un format prédéfinie le résultat peut varier en fonction de la culture:

Csharp.svg
var dt = new DateTime(1984, 1, 30);

dt.ToString("d", new CultureInfo("fr-FR")); // 30/01/1984
dt.ToString("d", new CultureInfo("en-US")); // 1/30/1984


Par contre les formats personnalisés forcent le format et ne permettent pas de variations en fonction de la culture.
De plus il n'est pas possible de combiner un format standard à un format personnalisé.
L'utilisation de DateTimeFormatInfo permet de créer un format personnalisé en fonction de la culture.

Csharp.svg
var dateTimeFormatFr = DateTimeFormatInfo.GetInstance(new CultureInfo("fr-FR"));
var dateTimeFormatUs = DateTimeFormatInfo.GetInstance(new CultureInfo("en-US"));

var customFormatFr = dateTimeFormatFr.ShortDatePattern; // dd/MM/yyyy
var customFormatUs = dateTimeFormatUs.ShortDatePattern; // M/d/yyyy

Timezone

Cs.svg
var dt = new DateTime(2024, 7, 18, 0, 0, 0);
// consider the datetime as Paris datetime then convert it to UTC
TimeZoneInfo.ConvertTimeToUtc(dt, TimeZoneInfo.FindSystemTimeZoneById("Romance Standard Time")); // 2024, 7, 17, 22, 0, 0

Timezone names

DateOnly

Cs.svg
DateOnly date = DateOnly.FromDateTime(DateTime.Now);

DateTime dateTime = date.ToDateTime(new TimeOnly());

Temps écoulé depuis 1970

Csharp.svg
var dt = DateTime.Now;
long l = new DateTimeOffset(dt).ToUnixTimeMilliseconds();
Nécessite le Framework .NET 4.6

Comparison

Cs.svg
var max = date1 > date2 ? date1 : date2;
var max = new[] { date1, date2, date3 }.Max();

public static T Max<T>(T first, T second) {
    if (Comparer<T>.Default.Compare(first, second) > 0)
        return first;
    return second;
}

var max = Max(date1, date2);

Exemples

Cs.svg
var firstDayOfMonth = myDate.Date.AddDays(1 - myDate.Day);
var firstDayOfMonth = new DateTime(myDate.Year, myDate.Month, 1);

var lastDayOfMonth = myDate.AddDays(DateTime.DaysInMonth(myDate.Year, myDate.Month) - myDate.Date);
var lastDayOfMonth = new DateTime(myDate.Year, myDate.Month, DateTime.DaysInMonth(myDate.Year, myDate.Month));