0

我需要用户能够选择一个日期,但可能会发生用户不知道确切的日期或月份,而是年份。

我正在考虑创建一个带有下拉列表的选择器,每个列表中都有可选项目,并将其保存在一个DateTime属性中。但我不知道如何指定未知部分的值。

我可以为日、月和年使用单独int?的字段,但我想知道是否有更好的方法。

有任何想法吗?

4

5 回答 5

4

DateTime 必须是有效日期,因此您不能只将年份放入其中,您至少还需要日期和月份。这在您的情况下是有问题的,因为您无法区分日期 01/01/2012 和 2012 年。除非您还有日期和月份,否则我看不出如何将值保留在 DateTime 中。

正如您所说,这里最好的解决方案是将这些值保存在整数中,并将值 0 放在未指定的字段中。

于 2012-08-25T03:40:27.497 回答
0

我建议您创建一个自定义类。

public class CustomDate
{
   public int? Day { get; set; }

   public int? Month { get; set; }

   public int Year { get; set; }

   public DateTime? Date
   {
      get
      {
        if(Year > 0 && Day.HasValue && Day.Value > 0 
           && Month.HasValue && Month.Value > 0)

            return new DateTime(Year, Month.Value, Day.Value);

         return null;
      }
   }
}
于 2012-08-25T16:46:52.907 回答
0

在用户界面上,您可以使用日期范围而不是单个日期吗?

如果他们只知道年份,则选择该年份的 1/1 到 12/31 的范围。无论哪种方式,最好选择一个完整的日期,而不是一个无效/部分日期。

于 2012-08-25T04:02:33.603 回答
0

是的,使用单独的字段。具有在 mdl 中选择月份、1、2、3...12 和在 ddl 中选择日期 1、2、3...31 的值。ydl 中没有选择年份。而是保留一些理想值,例如选择当前年份

ddl,mdl,ydl 我的意思是你的下拉列表的名称分别为日、月、年

显示强制选择年份的用户指南标签

可选(示例代码):

当用户提交时,为了检查月份和日期,您应该进行验证

string userDate = ""
if (ddl.SelectedIndex>0)
{ //then you can try to validate date as
try
{
string temp=ydl.SelectedItem.ToString()+"-"+ydl.SelectedItem.ToString();
temp += " "+ydl.SelectedItem.ToString()
DateTime dt=Convert.ToDateTime(temp);
userDate=dt.ToString("yyyy-MM-dd");
}
catch
{
//Display message on some label that chosen date is invalid
return;
}
}
else
{
userDate=ydl.SelectedItem.ToString();
if (mdl.SelectedIndex>0)
{
userDate += mdl.SelectedItem.ToString();
}
}

现在您可以将 userDate (string) 用于您想要使用的目的

记住这里你不应该使用 dateDatime 而不是像 userDate 这样的字符串,因为用户输入会变成像 2012-01-01 一样的固定日期。在这种情况下,您不能仅使用年份

于 2012-08-25T04:04:51.730 回答
0

在css中试试这个

input[type=date] {
::-webkit-datetime-edit-month-field[disabled]{}
::-moz-datetime-edit-day-field[disabled]{};
::-ms-datetime-edit-day-field[disabled]{};
::-o-datetime-edit-day-field[disabled]{};
}

http://qnimate.com/guide-to-styling-html5-input-elements/

于 2015-11-21T18:08:05.450 回答