【问题标题】:Problems sending datetime from javascript client to ASP.NET core to SQL server将日期时间从 javascript 客户端发送到 ASP.NET 核心到 SQL 服务器时出现问题
【发布时间】:2020-11-25 07:43:28
【问题描述】:

我从 JS 方面开始:

var startDate = new Date("Thu Nov 19 2020 00:00:01 GMT+1100 (Australian Eastern Daylight Time)");
var unixStartDate = startDate.getTime(); // 1605704401000

var endDate = new Date("Thu Nov 19 2020 23:59:59 GMT+1100 (Australian Eastern Daylight Time)");
var unixEndtDate = endDate.getTime(); // 1605790799000 

我现在将 unixStartDate unixEndtDate 发送到我的 .NET5 EF 核心服务器与我所在的 JS 客户端和 SQL 服务器在同一台机器上

var startDateUTC = DateTimeOffset.FromUnixTimeMilliseconds(unixStartDate); 
var startDateStr = startDateUTC.ToString(); // {18-Nov-20 1:00:01 PM +00:00}

var endDateUTC = DateTimeOffset.FromUnixTimeMilliseconds(unixEndDate); 
var endDateStr = endDateUTC.ToString(); // {19-Nov-20 12:59:59 PM +00:00}

dbc.SystemLogs
  .Where(v => startDateUTC <= v.LogTime)
  .Where(v => v.LogTime <= endDateUTC)
  .ToList()

在我的 EF 日志中我看到:

Executed DbCommand (947ms) [Parameters=[@__startDateUTC_1='2020-11-18T13:00:01.0000000+00:00' (Nullable = true), @__endDateUTC_2='2020-11-19T12:59:59.0000000+00:00' (Nullable = true)], CommandType='Text', CommandTimeout='30']
      SELECT [s].[LogText], [s].[LogTime]
      FROM [SystemLog] AS [s]
      WHERE (@__startDateUTC_1 <= CAST([s].[LogTime] AS datetimeoffset))) AND (CAST([s].[LogTime] AS datetimeoffset) <= @__endDateUTC_2)

请注意,LogTime 在 SQLserver 上的类型为 datetime

但是我得到的结果来自错误的日期:

{SystemLog { LogTime = 18-Nov-20 4:13:36 PM, LogText = User Session Expired. }} 
{SystemLog { LogTime = 18-Nov-20 4:10:47 PM, LogText = User Login Success. }}

那是我从 11 月 18 日而不是 11 月 19 日得到结果 我在这里错过了什么?

我也试过了:

DateTimeOffset startDate = TimeZoneInfo.ConvertTime(startDateUTC, TimeZoneInfo.Local);
DateTimeOffset endDate = TimeZoneInfo.ConvertTime(endDateUTC, TimeZoneInfo.Local);

dbc.SystemLogs
  .Where(v => startDate <= v.LogTime)
  .Where(v => v.LogTime <= endDate)
  .ToList()

然后运行相同的查询。 我明白了:

Executed DbCommand (947ms) [Parameters=[@__startDateUTC_1='2020-11-19T00:00:01.0000000+11:00' (Nullable = true), @__endDateUTC_2='2020-11-19T23:59:59.0000000+11:00' (Nullable = true)], CommandType='Text', CommandTimeout='30']
      SELECT [s].[LogText], [s].[LogTime]
      FROM [SystemLog] AS [s]
      WHERE (@__startDateUTC_1 <= CAST([s].[LogTime] AS datetimeoffset))) AND (CAST([s].[LogTime] AS datetimeoffset) <= @__endDateUTC_2)

但我得到同样错误的结果

【问题讨论】:

  • 我建议使用startDate.toISOString() 而不是使用.getTime()。然后你可以用DateTimeOffset.Parse(isoStringDate, System.Culture.InvariantCulture); 解析它。不过,我不确定这是否对您的特定场景有帮助。
  • 两个值都不正确吗? 13:00:01 + 11:00 =(第二天)00:00:01。 12:59:59 + 11:00 =(同一天)23:59:59。
  • (unixEndtDate - unixStartDate) / 1000的值为86398秒,与C#中startDateendDate的时间差一致。
  • FYI: "返回的DateTimeOffset实例的Offset属性值为TimeSpan.Zero,表示协调世界时,可以通过调用将其转换为特定时区的时间TimeZoneInfo.ConvertTime(DateTimeOffset, TimeZoneInfo) 方法。"
  • 感谢@John 我编辑了我的问题

标签: javascript c# asp.net-core datetimeoffset


【解决方案1】:

好的,问题是我需要DateTime 而不是DateTimeOffset 来查询SQLserver,因为字段类型是DateTime

所以这就是整个工作:

JS 客户端:

var startDate = new Date("Thu Nov 19 2020 00:00:01 GMT+1100 (Australian Eastern Daylight Time)");
var unixStartDate = startDate.getTime(); // 1605704401000

var endDate = new Date("Thu Nov 19 2020 23:59:59 GMT+1100 (Australian Eastern Daylight Time)");
var unixEndtDate = endDate.getTime(); // 1605790799000 

.NET 核心服务器:

namespace System {
  public static class UnixTime {
    static public DateTime ToLocalDateTime(long unixTimeMs) {
      return DateTimeOffset.FromUnixTimeMilliseconds(unixTimeMs).LocalDateTime;
    }
  }
}

DateTime startDate = UnixTime.ToLocalDateTime(unixStartDate);
DateTime endDate = UnixTime.ToLocalDateTime(unixEndDate);

dbc.SystemLogs.Where(v => startDate <= v.LogTime && v => v.LogTime <= endDate)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-12
    • 2011-10-24
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 2016-04-09
    • 1970-01-01
    相关资源
    最近更新 更多