【问题标题】:Use one DatePicker to choose date for end and start time使用一个 DatePicker 选择结束日期和开始时间
【发布时间】:2020-11-05 18:57:04
【问题描述】:

我有一个预订创建视图,用户可以在其中选择带有日期和时间的开始和结束时间。但是我希望有一个字段选择日期和两个字段作为开始和结束时间(只有时间,没有日期),所以在字段中选择的日期是结束和开始 DateTime 的日期。

现在我有三个 DateTime 值和 HTML 标签 DataType.Date 和 DateTime.Time,所以它在用户视图中已经“有效”。但是它将开始和结束时间的日期设置为 Date.Now,所以我必须为开始和结束创建一个新的 DateTime 值,并使用日期字段中的日期。这行得通,但是有没有更简单、更好的方法来做到这一点?还是我必须更改使用 DateTime.MinValue/MaxValue 初始化值的方式?

我的预订舱位:

private DateTime day; 
private DateTime start = DateTime.MinValue;
private DateTime end = DateTime.MaxValue;

[DataType(DataType.Date)]
[Required]
public DateTime day //+get set methods

[DataType(DataType.Time)]
[Required]
public DateTime start //+get set methods

[DataType(DataType.Time)]
[Required]
public DateTime end //+get set methods

我在控制器中的 Create 方法的一部分:

public IActionResult Create(Booking b)
{   
 DateTime temp = b.end;
 newRequest.end = DateTime.MaxValue; //necessariy so it won't throw an exception, because start time has to be before end time
 b.start = new DateTime(b.day.Year, b.day.Month, b.day.Day, b.start.Hour, b.start.Minute, b.start.Second);
 b.end = new DateTime(b.day.Year, b.day.Month, b.day.Day, temp.Hour, temp.Minute, temp.Second);
}

【问题讨论】:

  • 对于您的视图模型,您不应该使用DateTime? 吗?
  • 我已经考虑过了,但是预订分配算法会复杂得多,因为现在您可以按日期时间将其排序在一个列表中,否则您每天需要多个排序列表.

标签: c# asp.net-mvc


【解决方案1】:

不知道你的变量最终会是什么,但这应该没关系..假设那一天有正确的日期,可能有一些不正确或不相关的时间,开始和结束有一些不正确或不相关的日期,也许今天或 01/01/0000,以及正确的时间:

DateTime chosenStart =
  day.Date //in case it has some stray time component 
  + (start - start.Date); //make a time span and add to day
  • 您可以使用 + 将 DateTime 和 TimeSpan 一起添加

  • 您可以通过从后一个日期时间中减去前一个日期时间来生成一个 TimeSpan

由于您的开始 DateTime 是一个时间,但表示为一个日期时间,我们可以通过询问自午夜以来的时间将其转换为时间跨度:

2000-01-01_12:34 minus 2000-01-01_00:00 is a time span of 12:34

日期是什么并不重要,通过从有时间的日期时间中减去午夜日期时间,我们得到时间跨度..

.. 可以添加到另一个午夜日期时间以生成当天的日期和时间

如果您确定那一天只会是带有午夜日期的日期时间,您可以跳过对它的 .Date 调用

var x = day + (start - start.Date);

现在请注意,您的时间分区逻辑一切正常!

【讨论】:

  • 感谢您的帮助,这看起来比我的版本干净得多。天确实有一个不相关的时间价值..
  • 我应该补充一点,您实际上可以通过从任何更早或更晚的日期中减去任何日期来得出时间跨度。只是如果您这样做earlier - later 它是负数,这是您不想要的在这种情况下
猜你喜欢
  • 1970-01-01
  • 2012-05-31
  • 1970-01-01
  • 2021-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-02
  • 1970-01-01
相关资源
最近更新 更多