2017-09-13 69 views
0

我正在尝试创建一个允许用户为特定日期安排事件的系统。只有在考虑时区时才能处理保存日期?

在服务器端,我有一个SQL作业,每天在EST上午3:00运行。

在客户端,用户在日期选择器中选择日期。

我需要确保SQL作业可以查看用户保存的日期并在用户时区的任何一天执行操作。

我试过存储以下(粗C#伪代码):

DateTime scheduledDateUtc = ConvertToUTC(dateEnteredByUser.Date, usersTimezone).Date; 

然后我执行基于SQL作业下面的对比情况:

WHERE CONVERT(DATE, scheduled_date_utc) = CONVERT(DATE, GETUTCDATE()) 

这是失败的一些边缘案例,肯定是错误的,但我不知道什么是正确的战略。

此外,我不清楚我应该如何为这些边缘情况编写单元测试。

谢谢!

+0

你并不需要担心的时区。计算机本地时区设置将自动调整。 DateTime对象以UTC时间自动保存在每台计算机上,并以UTC时间在PC和数据库之间传输(如果不使用字符串)。所以不需要转换。 – jdweng

+0

“失败”是什么意思?你当前的代码产生了什么错误? –

+1

@jdweng这取决于他在SQL中的列类型。 'DateTime'和'DateTime2'没有时区信息,而DateTimeOffset呢。使用'DateTime'列时,用户输入应首先[转换为UTC](https://msdn.microsoft.com/en-us/library/system.datetime.touniversaltime.aspx)。 – Romoku

回答

0

你确定你需要转换为UTC吗?不用手动转换为UTC我会尝试设置它像这样

DateTime scheduledDateUtc = DateTime.SpecifyKind(dateEnteredByUser.Value, DateTimeKind.Utc);

+0

如果用户接近更极端的时区,这可能会导致问题;即UTC + 12或UTC-11。 – user3722952

相关问题