将日期时间从 javascript 客户端发送到 ASP.NET 核心到 SQL 服务器时出现问题
Problems sending datetime from javascript client to ASP.NET core to SQL server
我从 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)
请注意,SQL服务器
上的 LogTime 类型为 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)
但我得到了同样错误的结果
好的,问题是我需要 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)
我从 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)
请注意,SQL服务器
上的 LogTime 类型为 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)
但我得到了同样错误的结果
好的,问题是我需要 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)