【问题标题】:Compare different date format比较不同的日期格式
【发布时间】:2022-11-17 06:46:38
【问题描述】:

我正在按日期搜索。即使以下日期相同,它们也不会返回 true,因为来自 Json 的时间与 datetimepicker 返回的时间不同。

我只想按日期比较,而不是时间。 以下应该是正确的:

Date selected by user -> 2022-11-26T00:00:00
Date I get from Json  -> 26.11.2022 12:42:09

我怎样才能比较这个并返回 true。谢谢你。

<input type="date" @onchange="DateOnChange" bind="dateSelectedByUser" placeholder="SearchByDate" />

 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.dateFromJson == dateSelectedByUser ).ToArray();
    StateHasChanged();   
 }

编辑:

我应该可以在这里更改格式吗?

List<Item> result = items.GroupBy(x => x.ItemNo)
   .Select(x => new Item
    {
        ItemNo = x.Key,
        date = x.FirstOrDefault(y => y.Key == "Date")?.Value != null
            ? DateTime.ParseExact(x.FirstOrDefault(y => y.Key == "Date")?.Value, "dd.MM.yyyy HH:mm:ss", CultureInfo.InvariantCulture)
            : (DateTime?)null
    })

.ToList();

【问题讨论】:

  • Value.ToString(); <-- 这是你的问题。这将使用特定于请求而不是不变的 CurrentCulture。相反,总是指定一个明确的格式。我不建议特别使用 InvariantCulture,因为它使用美国日期格式而不是 ISO 8601,但制作您自己的符合 ISO 8601 的 CultureInfo 很简单。
  • 另一种方法是完全避免 DateTime 值的 JSON 字符串表示,并使用 Int64 整数 Unix 时间值,这是可靠且机器可移植的,即使不是人类直接可读的。
  • DateTime.Today <-- 你有充分的理由不使用 UTC 吗?
  • 我想你误解了我的问题......
  • DateTime 可以分为 3 种:UTC、本地和未指定 - 并且有问题!因此,请尽快尝试使用 DateTimeOffset 而不是 DateTime,方法是将其转换为 DateTime。并使用格式模式解析字符串(json 格式是否始终相同 - 看起来像欧洲格式) - 注意:dots in format pattern could be / with en-US culture (or was it vice-versa)!

标签: c# blazor webassembly


【解决方案1】:

我怎样才能比较这个并返回 true

如何处理 DateTime 是一个非常讨厌的面试问题。它会抓住大多数程序员。

让我们看看你的代码。

您的输入类型设置为 date 即没有时间的日期,但您的数据类型设置为 DateTime。尽管您没有收到任何错误或警告,但实际上您已经越过了类型错误边界。如果现在存储date1和date2,date1 == date2将始终返回 false。除非您将它们存储在完全相同的时间点(这在同一台机器上是不可能的),否则它们将是不同的。

有一些现代 C#(和数据库)编码规则需要遵循:

  1. 如果您只对日期感兴趣,请使用DateOnly 类型。
  2. 否则使用DateTimeOffset。

    虽然我确定我会从那些不同意的人那里得到 cmets,但所有其他 TimeDate 东西都是为了保持与旧 C# 的向后兼容性,旧 C# 对于日期时间来说太简单了!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    • 2019-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    相关资源
    最近更新 更多