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

.net-在应用程序级别定义时区,.net,datetime,timezone,.net,Datetime,Timezone,我有一个由多个子应用程序组成的全局应用程序: 网站 Windows服务 我想在许多服务器中分派这些“应用程序部分”。 我的问题是:我希望日期仍然准确。 如果事件存储在太平洋时间下午6:00,我不希望我的欧洲用户在他们的板上看到“下午6:00” 我读过很多文章说“你只需要用这种方式保存你的约会” =>但是,我不能改变保存每个日期的方式,这代表了太多的工作(是的,保存的是日期时间,而不是日期偏移) 我读过其他文章建议更改服务器上的时区=>但是我不想这样做,因为这些服务器可以用于其他目的 好消息是

我有一个由多个子应用程序组成的全局应用程序:

  • 网站
  • Windows服务
我想在许多服务器中分派这些“应用程序部分”。 我的问题是:我希望日期仍然准确。 如果事件存储在太平洋时间下午6:00,我不希望我的欧洲用户在他们的板上看到“下午6:00”

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

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

好消息是日期总是在应用程序中定义,而不是由数据库生成

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

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

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

谢谢你的帮助


编辑:假设我的问题只是拥有日期时间。现在返回UTC日期
有没有办法做到这一点?

将所有时间都存储在UTC中

DateTime.UtcNow
然后对客户进行TZ校正

编辑:我错过了关于不改变日期时间的关键部分。让程序员把它做好;它也同样容易出错

您需要让所有客户端代码使用DateTime.UtcNow,或者让所有客户端代码使用数据库获取时间戳。不管怎样,你都有工作要做。


祝你好运

以UTC存储所有时间

DateTime.UtcNow
然后对客户进行TZ校正

编辑:我错过了关于不改变日期时间的关键部分。让程序员把它做好;它也同样容易出错

您需要让所有客户端代码使用DateTime.UtcNow,或者让所有客户端代码使用数据库获取时间戳。不管怎样,你都有工作要做。


祝你好运

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

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

// 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;
}

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

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

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

// 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;
}

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

一个选项:以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;
}

一个选项:以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;
}

你不能使用
app.config
?这里有一个实际的问题吗?你的意思是,“我没有时间用正确的方式做事,我只想在保留错误代码的同时得到正确的答案。”这听起来准确吗?容易出错吗?以UTC时间存储和检索所有内容。我认为这是你唯一真正的解决办法。相关问题:@JonSkeet:你给我的答案很难^^^事实上,他们是许多国家的许多开发人员,在全球平台的许多部分工作,他们中的许多人是自由职业者,在应用程序上工作了几周。我的问题是找到这个问题的解决方案,并且有DateTime。现在总是返回UTC日期是解决方案。另一个解决方案是替换每个DateTime。现在在DateTime.UtcNow中,检查平台所有部分上所有开发人员的所有代码。。。好吧,如果我可以选择……你不能使用
app.config
?这里有一个实际的问题吗?你的意思是,“我没有时间用正确的方式做事,我只想在保留错误代码的同时得到正确的答案。”这听起来准确吗?容易出错吗?以UTC时间存储和检索所有内容。我认为这是你唯一真正的解决办法。相关问题:@JonSkeet:你给我的答案很难^^^事实上,他们是许多国家的许多开发人员,在全球平台的许多部分工作,他们中的许多人是自由职业者,在应用程序上工作了几周。我的问题是找到这个问题的解决方案,并且有DateTime。现在总是返回UTC日期是解决方案。另一个解决方案是替换每个DateTime。现在在DateTime.UtcNow中,检查平台所有部分上所有开发人员的所有代码。。。如果我可以选择…你的解决方案意味着改变数百万行代码^^^,因为我们需要改变保存每个日期的方式。这就是我想解决的问题…@莫斯:是的,当你和一个坏女人在一起的时候