Est-il possible d'inclure le suffixe du jour lors du formatage d'une date à l'aide de DateTime.ToString ()?
Par exemple, j'aimerais imprimer la date dans le format suivant - lundi 27 juillet 2009. Cependant, l'exemple le plus proche que je puisse trouver avec DateTime.ToString () est le lundi 27 juillet 2009.
Puis-je le faire avec DateTime.ToString () ou vais-je devoir revenir à mon propre code?
En tant que référence, j'utilise toujours/référence à SteveX String Formatting Il ne semble pas y avoir de "th" parmi les variables disponibles, mais vous pouvez facilement créer une chaîne avec
string.Format("{0:dddd dd}{1} {0:MMMM yyyy}", DateTime.Now, (?));
Vous devrez alors fournir un "st" pour 1, "nd" pour 2, "rd" pour 3 et "th" pour tous les autres et pourrait être associé à une instruction "?:".
(DateTime.Now.Day % 10 == 1 && DateTime.Now.Day != 11) ? "st"
: (DateTime.Now.Day % 10 == 2 && DateTime.Now.Day != 12) ? "nd"
: (DateTime.Now.Day % 10 == 3 && DateTime.Now.Day != 13) ? "rd"
: "th"
Une autre option utilisant switch:
string GetDaySuffix(int day)
{
switch (day)
{
case 1:
case 21:
case 31:
return "st";
case 2:
case 22:
return "nd";
case 3:
case 23:
return "rd";
default:
return "th";
}
}
Utilisation de quelques méthodes d’extension:
namespace System
{
public static class IntegerExtensions
{
public static string ToOccurrenceSuffix(this int integer)
{
switch (integer % 100)
{
case 11:
case 12:
case 13:
return "th";
}
switch (integer % 10)
{
case 1:
return "st";
case 2:
return "nd";
case 3:
return "rd";
default:
return "th";
}
}
}
public static class DateTimeExtensions
{
public static string ToString(this DateTime dateTime, string format, bool useExtendedSpecifiers)
{
return dateTime.ToString(format)
.Replace("nn", dateTime.Day.ToOccurrenceSuffix().ToLower())
.Replace("NN", dateTime.Day.ToOccurrenceSuffix().ToUpper());
}
}
}
Usage:
return DateTime.Now.ToString("dddd, dnn MMMM yyyy", useExtendedSpecifiers: true);
// Friday, 7th March 2014
Remarque: La méthode d’extension d’entier peut être utilisée pour n’importe quel nombre, pas seulement entre 1 et 31. Par exemple.
return 332211.ToOccurrenceSuffix();
// th
Une autre option utilise l’opérateur Modulo :
public string CreateDateSuffix(DateTime date)
{
// Get day...
var day = date.Day;
// Get day modulo...
var dayModulo = day%10;
// Convert day to string...
var suffix = day.ToString(CultureInfo.InvariantCulture);
// Combine day with correct suffix...
suffix += (day == 11 || day == 12 || day == 13) ? "th" :
(dayModulo == 1) ? "st" :
(dayModulo == 2) ? "nd" :
(dayModulo == 3) ? "rd" :
"th";
// Return result...
return suffix;
}
Vous pouvez ensuite appeler la méthode ci-dessus en transmettant un objet DateTime en tant que paramètre, par exemple:
// Get date suffix for 'October 8th, 2019':
var suffix = CreateDateSuffix(new DateTime(2019, 10, 8));
Pour plus d'informations sur le constructeur DateTime, voir Page Microsoft Docs .
Voici la version étendue incluant les 11, 12 et 13:
DateTime dt = DateTime.Now;
string d2d = dt.ToString("dd").Substring(1);
string daySuffix =
(dt.Day == 11 || dt.Day == 12 || dt.Day == 13) ? "th"
: (d2d == "1") ? "st"
: (d2d == "2") ? "nd"
: (d2d == "3") ? "rd"
: "th";
En prenant la réponse de @ Lazlow à une solution complète, voici une méthode d'extension entièrement réutilisable, avec un exemple d'utilisation;
internal static string HumanisedDate(this DateTime date)
{
string ordinal;
switch (date.Day)
{
case 1:
case 21:
case 31:
ordinal = "st";
break;
case 2:
case 22:
ordinal = "nd";
break;
case 3:
case 23:
ordinal = "rd";
break;
default:
ordinal = "th";
break;
}
return string.Format("{0:dddd dd}{1} {0:MMMM yyyy}", date, ordinal);
}
Pour l'utiliser, vous l'appelez simplement sur un objet DateTime
;
var myDate = DateTime.Now();
var myDateString = myDate.HumanisedFormat()
Ce qui vous donnera:
Vendredi 17 juin 2016
Voici une méthode d'extension (parce que tout le monde aime les méthodes d'extension), avec la réponse de Lazlow comme base (choisie par Lazlow car elle est facile à lire).
Fonctionne comme la méthode ToString()
régulière sur DateTime
avec l'exception que si le format contient d
ou dd
, le suffixe sera ajouté automatiquement.
/// <summary>
/// Return a DateTime string with suffix e.g. "st", "nd", "rd", "th"
/// So a format "dd-MMM-yyyy" could return "16th-Jan-2014"
/// </summary>
public static string ToStringWithSuffix(this DateTime dateTime, string format, string suffixPlaceHolder = "$") {
if(format.LastIndexOf("d", StringComparison.Ordinal) == -1 || format.Count(x => x == 'd') > 2) {
return dateTime.ToString(format);
}
string suffix;
switch(dateTime.Day) {
case 1:
case 21:
case 31:
suffix = "st";
break;
case 2:
case 22:
suffix = "nd";
break;
case 3:
case 23:
suffix = "rd";
break;
default:
suffix = "th";
break;
}
var formatWithSuffix = format.Insert(format.LastIndexOf("d", StringComparison.InvariantCultureIgnoreCase) + 1, suffixPlaceHolder);
var date = dateTime.ToString(formatWithSuffix);
return date.Replace(suffixPlaceHolder, suffix);
}
Je pense que c'est une bonne solution, couvrant des nombres tels que 111ème etc.:
private string daySuffix(int day)
{
if (day > 0)
{
if (day % 10 == 1 && day % 100 != 11)
return "st";
else if (day % 10 == 2 && day % 100 != 12)
return "nd";
else if (day % 10 == 3 && day % 100 != 13)
return "rd";
else
return "th";
}
else
return string.Empty;
}
Je l’ai fait comme ça, il résout certains des problèmes évoqués dans les autres exemples.
public static string TwoLetterSuffix(this DateTime @this)
{
var dayMod10 = @this.Day % 10;
if (dayMod10 > 3 || dayMod10 == 0 || (@this.Day >= 10 && @this.Day <= 19))
{
return "th";
}
else if(dayMod10 == 1)
{
return "st";
}
else if (dayMod10 == 2)
{
return "nd";
}
else
{
return "rd";
}
}
Obtenir le suffixe de date. (Fonction statique)
public static string GetSuffix(this string day)
{
string suffix = "th";
if (int.Parse(day) < 11 || int.Parse(day) > 20)
{
day = day.ToCharArray()[day.ToCharArray().Length - 1].ToString();
switch (day)
{
case "1":
suffix = "st";
break;
case "2":
suffix = "nd";
break;
case "3":
suffix = "rd";
break;
}
}
return suffix;
}
public static String SuffixDate (DateTime date) { ordinal à cordes;
switch (date.Day)
{
case 1:
case 21:
case 31:
ordinal = "st";
break;
case 2:
case 22:
ordinal = "nd";
break;
case 3:
case 23:
ordinal = "rd";
break;
default:
ordinal = "th";
break;
}
if (date.Day < 10)
return string.Format("{0:d}{2} {1:MMMM yyyy}", date.Day, date, ordinal);
else
return string.Format("{0:dd}{1} {0:MMMM yyyy}", date, ordinal);
}
Pour ce que sa vaut ici est ma solution finale en utilisant les réponses ci-dessous
DateTime dt = DateTime.Now;
string d2d = dt.ToString("dd").Substring(1);
string suffix =
(dt.Day == 11 || dt.Day == 12 || dt.Day == 13) ? "th"
: (d2d == "1") ? "st"
: (d2d == "2") ? "nd"
: (d2d == "3") ? "rd"
: "th";
Date.Text = DateTime.Today.ToString("dddd d") + suffix + " " + DateTime.Today.ToString("MMMM") + DateTime.Today.ToString(" yyyy");
Une solution VB pas chère et gaie:
litDate.Text = DatePart("dd", Now) & GetDateSuffix(DatePart("dd", Now))
Function GetDateSuffix(ByVal dateIn As Integer) As String
'// returns formatted date suffix
Dim dateSuffix As String = ""
Select Case dateIn
Case 1, 21, 31
dateSuffix = "st"
Case 2, 22
dateSuffix = "nd"
Case 3, 23
dateSuffix = "rd"
Case Else
dateSuffix = "th"
End Select
Return dateSuffix
End Function