我正在按日期进行搜索。即使下面的日期是相同的,它们也不会返回true,因为Json中的时间与datetimepicker返回的时间不同。
我只想比较日期,而不是时间。下面应该为真:
用户选择的日期->2022 - 11 - 26 - t00:00:00我从Json中得到的日期->26.11.2022 12:42:09
如何比较这个并返回true。谢谢你。
private DateTime dateSelectedByUser = DateTime.Today;
public async Task DateOnChange(ChangeEventArgs args)
{
var value = args.Value.ToString();
dateSelectedByUser = value == string.Empty ? DateTime.Today : DateTime.Parse(value);
result = items.Where(item=> item.date == dateSelectedByUser ).ToArray();
}
谢谢。
如何处理约会时间是一个非常令人讨厌的面试问题。这会让大多数程序员措手不及。如何比较此值并返回true
让我们看看你的代码。
您的输入类型设置为date
,即日期没有时间,但您的数据类型设置为DateTime
。尽管您没有得到错误或警告,但实际上您已经越过了类型错误的边界。如果您现在存储date1
和date2
,date1 == date2
将始终返回false。除非您将它们存储在精确的同一时间点(这在同一台机器上是不可能的),否则它们将是不同的。
有一些现代c#(和数据库)编码规则需要遵循:
- 如果您只对日期感兴趣,请使用
DateOnly
类型。 - 否则使用
DateTimeOffset
虽然我肯定会得到那些不同意的人的评论,但所有其他timeate的东西都是为了保持与旧的c#的向后兼容性,旧的c#在日期时间上过于简单!
下面是一个基于您提供的代码的简单Demo页面。没有迹象表明json日期适合,所以这是DateFromSomewhereElse
。
@page "/"
<PageTitle>Index</PageTitle>
<h1>Hello, world!</h1>
<input class="form-control mb-3" type="date" @bind-value=this.MyDate />
<div class="@this.AlertCss"> Dates Are the Same: @this.DatesAreSame </div >
@code {
private DateOnly MyDate = DateOnly.FromDateTime(DateTime.Now);
private DateTime DateFromSomewhereElse = DateTime.Now;
private bool DatesAreSame => MyDate == DateOnly.FromDateTime(DateFromSomewhereElse);
private string AlertCss => this.DatesAreSame
? "alert alert-success"
: "alert alert-danger";
}
对于c# 10之前的版本:
为DateTime和DateTimeOffset创建扩展方法以获取午夜值:
public static class DateTimeExtensions
{
public static DateTime AsDateOnly(this DateTime value)
=> new DateTime(value.Year, value.Month, value.Day);
public static DateTime AsDateOnly(this DateTimeOffset value)
=> new DateTime(value.Year, value.Month, value.Day);
}
然后测试页:
@page "/"
<PageTitle>Index</PageTitle>
<h1>Hello, world!</h1>
<input class="form-control mb-3" type="date" @bind-value=this.MyDate />
<div class="@this.AlertCss"> Dates Are the Same: @this.DatesAreSame </div >
@code {
private DateTimeOffset MyDate = DateTimeOffset.Now;
private DateTimeOffset DateFromSomewhereElse = DateTimeOffset.Now;
private bool DatesAreSame => MyDate.AsDateOnly() == DateFromSomewhereElse.AsDateOnly();
private string AlertCss => this.DatesAreSame
? "alert alert-success"
: "alert alert-danger";
}