.net - 在应用程序级别定义TimeZone

时间:2011-01-21 17:36:36

标签: .net datetime timezone

我有一个由许多子应用程序编写的全局应用程序:

  • 网站
  • Windows服务

我想在许多服务器中发送这些“应用程序部分”。 我的问题是:我希望日期仍然准确。 如果一个活动在太平洋时间下午6点存储,我不希望我的欧洲用户在他们的主板上看到“6:00 PM”。

我读了很多文章说“你只需要保存日期” =>但是我不能改变保存每个日期的方式,这代表了太多的工作(是的,它是保存的日期时间而不是日期偏移)。

我已阅读其他建议更改服务器上时区的文章=>但是我不能想要这样做,因为这些服务器可以用于其他目的。

好消息是日期始终在应用程序中定义,数据库未生成

因此,我唯一要做的就是在应用程序级别定义TimeZone 。因此,无论它们在哪里,我的应用程序将始终使用相同的时区。剩下的唯一步骤是在当前用户的时区中转换UI级别的日期(非常简单,因为所有日期都通过相同的本地化日期时间转换方法)。

我真的无法改变应用程序开发人员的工作方式,因为它很容易出错。他们需要继续使用DateTime.Now,而不考虑转换。

我使用的确切技术与此无关,问题是全球.Net。

感谢您的帮助


编辑:假设我的问题只是让 DateTime.Now 返回 UTC日期。 有没有办法做到这一点?

3 个答案:

答案 0 :(得分:1)

以UTC格式存储所有时间。

DateTime.UtcNow

然后在客户端处理TZ校正。

编辑:我错过了关于不更改DateTime.Now的关键部分。让程序员做得对;它不容易出错。

您需要让所有客户端代码都使用DateTime.UtcNow或让所有客户端代码使用数据库来获取时间戳。无论哪种方式 - 你都有工作要做。

祝你好运!

答案 1 :(得分:0)

我将给你一个简单的答案,理解如果答案很简单,我可能会误解这个问题:

将本地应用程序的时区保存在服务器上。然后你可以根据需要改变当地时间。如果您的本地开发人员正在使用DateTime.Now,那很好,只要在数据库中的某个位置,您就可以说DateTime.Now的值已针对此时区进行了调整。

是这样,还是我忽略了什么?

答案 2 :(得分:0)

选项:以GMT / UTC保存所有日期时间,然后通过用户(他们的浏览器)的javascript获取时区,并显示考虑该时区的日期。

// Gets the Browsers timezone offset in minutes
function getClientTimezoneOffsetInMinutes()
{
    var rightNow = new Date();
    var date1 = new Date(rightNow.getFullYear(), 0, 1, 0, 0, 0, 0);
    var date2 = new Date(rightNow.getFullYear(), 6, 1, 0, 0, 0, 0);
    var temp = date1.toGMTString();
    var date3 = new Date(temp.substring(0, temp.lastIndexOf(" ") - 1));
    var temp = date2.toGMTString();
    var date4 = new Date(temp.substring(0, temp.lastIndexOf(" ") - 1));
    var hoursDiffStdTime = (date1 - date3) / (1000 * 60 * 60);
    var hoursDiffDaylightTime = (date2 - date4) / (1000 * 60 * 60);
    return hoursDiffStdTime;
}