DateTime.ToString()を使用して日付をフォーマットするときに、日サフィックスを含めることはできますか?
たとえば、2009年7月27日月曜日の形式で日付を印刷したいと考えています。ただし、DateTime.ToString()を使用して見つけることができる最も近い例は、2009年7月27日月曜日です。
DateTime.ToString()でこれを行うことはできますか、それとも自分のコードにフォールバックする必要がありますか?
参考として、私は常に SteveX String Formatting を使用/参照し、利用可能な変数のいずれにも「th」は含まれていないように見えますが、
string.Format("{0:dddd dd}{1} {0:MMMM yyyy}", DateTime.Now, (?));
次に、1に「st」、2に「nd」、3に「rd」、その他すべてに「th」を指定する必要があり、「?:」ステートメントでインライン化できます。
var now = DateTime.Now;
(now.Day % 10 == 1 && now.Day != 11) ? "st"
: (now.Day % 10 == 2 && now.Day != 12) ? "nd"
: (now.Day % 10 == 3 && now.Day != 13) ? "rd"
: "th"
スイッチを使用する別のオプション:
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";
}
}
いくつかの拡張メソッドを使用します。
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 useExtendedSpecifiers
? dateTime.ToString(format)
.Replace("nn", dateTime.Day.ToOccurrenceSuffix().ToLower())
.Replace("NN", dateTime.Day.ToOccurrenceSuffix().ToUpper())
: dateTime.ToString(format);
}
}
}
使用法:
return DateTime.Now.ToString("dddd, dnn MMMM yyyy", useExtendedSpecifiers: true);
// Friday, 7th March 2014
注:整数拡張メソッドは、1〜31だけでなく、任意の数に使用できます。
return 332211.ToOccurrenceSuffix();
// th
別のオプションは モジュロ演算子 を使用しています:
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;
}
次に、パラメーターとしてDateTimeオブジェクトを渡すことにより、上記のメソッドを呼び出します。次に例を示します。
// Get date suffix for 'October 8th, 2019':
var suffix = CreateDateSuffix(new DateTime(2019, 10, 8));
DateTimeコンストラクターの詳細については、 Microsoft Docs Page を参照してください。
11、12、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";
完全なソリューションに対する@Lazlowの答えを取り上げると、次は完全に再利用可能な拡張メソッドであり、使用例があります。
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);
}
これを使用するには、単にDateTime
オブジェクトで呼び出します。
var myDate = DateTime.Now();
var myDateString = myDate.HumanisedFormat()
それはあなたに与えます:
2016年6月17日金曜日
[〜#〜] update [〜#〜]
NuGetパッケージ:
https://www.nuget.org/packages/DateTimeToStringWithSuffix
例:
https://dotnetfiddle.net/zXQX7y
サポート:
。NET Core 1.0以降
。NET Framework 4.5以降
ここに拡張メソッドがあります(誰もが拡張メソッドを愛しているため)。Lazlowの答えを基礎として(読みやすいLazlowを選びました)。
DateTime
またはd
がフォーマットに含まれている場合、接尾辞が自動的に追加されることを除いて、dd
の通常のToString()
メソッドと同様に機能します。 。
/// <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);
}
私は、これが111番目などの数字をカバーする良い解決策であると信じています:
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;
}
このようにして、他の例で与えられた問題のいくつかを回避しました。
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";
}
}
日付の接尾辞を取得します。 (静的関数)
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){文字列序数;
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);
}
ここでの価値は、以下の回答を使用した最終的なソリューションです
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");
安くて陽気なVBソリューション:
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