0

アプリケーションで 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;
}
4

1 に答える 1

3

DateTimeリテラル文字列区切り文字 (フォーマット文字列の場合)で囲む必要があります: '.

したがって、あなたの方法は次のようになります。

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 int GetSeason(DateTime date)
{
    //using decimal to avoid any inaccuracy issues
    decimal value = date.Month + date.Day / 100M;   // <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)
{
    switch (value)
    {
        case 0:
            return "'Spring'";
        case 1:
            return "'Summer'";
        case 2:
            return "'Autumn'";
        case 3:
            return "'Winter'";
    }
    return "";
}
于 2013-08-07T21:42:43.697 に答える