アプリケーションで DateTimePicker 値をカスタマイズするときに問題が発生しました。日付/時刻の解釈方法をカスタマイズするために使用できるさまざまな書式設定文字列についてすべて読みました。問題は、DateTimePicker の先頭にシーズンを文字列として追加できるように、カスタム フォーマット文字列で一部のテキストを実際に無視したいということです。
たとえば、今日の日付を 2013 年 8 月 7 日午後 5 時 30 分 (米国) とします。カスタム フォーマット文字列「MMM.d -h:mm tt」を使用すると、日付は 8 月 7 日 - 午後 5 時 30 分と表示されます。それで、それは完璧です。ただ、シーズンを文字列の先頭に追加したい。したがって、この場合は「夏: 8 月 7 日 - 午後 5 時 30 分」となります。
私が抱えている問題は、カスタム フォーマット文字列の先頭に「Summer」という単語を挿入すると、実際には double mm が dateTime の GetMinute 値として解釈されることです。シーズンはリテラルのままにしたいのですが、残りのフォーマット文字列は解釈されます (それが理にかなっている場合)。
私が使用しているコードは次のとおりです。
public Form1()
{
InitializeComponent();
dateTimePicker1.Format = DateTimePickerFormat.Custom;
season = getSeason(dateTimePicker1.Value);
dateTimePicker1.CustomFormat = convertSeason(season) + " : " + dt_format;
}
public int season = 1; //set default to summer
public string dt_format = "MMM.d -h:mm tt";
private int getSeason(DateTime date)
{
float value = (float)date.Month + date.Day / 100; // <month>.<day(2 digit)>
if (value < 3.21 || value >= 12.22) return 3; // Winter
if (value < 6.21) return 0; // Spring
if (value < 9.23) return 1; // Summer
return 2; // Autumn
}
private string convertSeason(int value)
{
string season = "Spring";
if (value == 1) season = "Summer";
else if (value == 2) season = "Autumn";
else if (value == 3) season = "Winter";
return season;
}
private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
{
season = getSeason(dateTimePicker1.Value);
dateTimePicker1.CustomFormat = convertSeason(season) + " : " + dt_format;
}