简体   繁体   中英

Problems sending datetime from javascript client to ASP.NET core to SQL server

I start on the JS side with:

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 

I now send unixStartDate unixEndtDate to my .NET5 EF core server on the same machine as the JS client and the SQL server where I do:

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()

In my EF logs I see:

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)

Note that LogTime is of type datetime on SQLserver

However the results I get are from the wrong dates:

{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. }}

That is I got results from the 18th Nov instead of the 19th Nov What am I missing here?

I also tried:

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()

and then run the same query. I see:

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)

but I get the same wrong results

OK the problem was that I needed DateTime not DateTimeOffset to query SQLserver as the field type was DateTime .

So here's the whole thing working:

JS client:

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 core server:

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)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM