如何更改 asp.net 应用程序的时区
Posted
技术标签:
【中文标题】如何更改 asp.net 应用程序的时区【英文标题】:How to change time zone for an asp.net application 【发布时间】:2012-01-25 05:12:59 【问题描述】:我需要将我的 ASP.NET 的默认时区设置为亚洲/达卡或 GMT+6 时区。但我找不到在全球范围内改变它的方法。 *** 和其他网络上有很多参考资料可以通过获取时区信息并在每次我需要 DateTime 对象时计算正确时间来做到这一点。
但是相信我,我不想这样做。所以不要给我任何这样的建议。我想最好从 web.config 将时区设置为 Asia/Dhaka 或 GMT+6。 (类似于我们在 php 中使用 php.ini 执行的操作)所以每次我需要 DateTime 对象时,无论服务器的时区是什么,都会使用我的时区评估时间。
这可能吗?如果可能那怎么办?? 提前感谢您的解决方案:)
【问题讨论】:
为什么你不想把事情做好?请记住,DateTime
没有 固有时区。 (在某些方面,这是一种非常奇怪的类型。)您应该通常(但不总是)将所有内容都保留在 UTC 中,而不是当它去往或来自用户时 - 为什么你不想遵循那个常见的模式?
问题是我有很多超过 100 个 aspx 页面的日期时间对象,并且需要在本地时区呈现它们。我不反对每次都保持 UTC。但我需要一个解决方案,用于在 aspx 页面中呈现本地时区时间而不更改所有页面。
听起来您真正需要的是一个放置DateTime
渲染代码的中心位置,然后您可以在任何需要的地方调用渲染一个DateTime
。您可能需要一次更改所有 100 个页面,但是对您需要呈现日期/时间的方式的任何进一步更改只需要在一个地方进行更改。
@JonSkeet ,我在一家拥有 20 名开发人员和 10 个不同 C# 项目的公司工作。如果有一种方法可以简单地更改 app/web.config 中的配置设置并使 DateTime.Now 考虑到定义的时区,它将为每个人节省大量时间和错误,不是吗? (而不是试图让每个人都使用 DateTime.UtcNow)。 *这是安装在远程计算机上的 WPF 客户端应用程序,由于客户端连接问题,我们需要记录本地时间(无法将其传递到数据库,然后才记录 DateTime.Now)
@UriAbramson:不,我认为这不是更好的解决方案。基本上,这将是您的开发人员使用错误的 API 的贴膏药。 DateTime.Now
按照它所说的去做 - 它返回系统本地时间。如果您尝试指定不同的时区,那么这不是您想要的行为,因此您不应该使用该属性。
【参考方案1】:
抱歉,.NET 中无法全局更改时区。
您唯一的方法是更改服务器的时区或重写所有代码。
最佳做法是完全不依赖系统时区(永远不要使用 DateTime.Now)。
您应该将所有日期处理为 Utc 日期,然后在向用户显示它们时转换为特定区域。
即使您设法在 ASP.NET 应用程序中处理时区,SQL Server 上仍然存在时区,例如 GETTIME 函数。如果您的应用程序完全是用 UTC 编写的,那么您的 SQL 服务器函数也可以正常工作。
【讨论】:
全球化设置不会改变 DateTime 对象的工作方式,因为大多数国家/地区会有很多时区,因此它不知道使用哪个时区。 感谢您的建议,看起来它根据文化区域更改了格式。但不是时间偏移。我确实同意将所有日期处理为 utc,但每次显示时都需要一种方法来转换它们。在我的应用程序中,我已经有数百个 DateTime 对象。我正在寻找一种方法,而不是搜索所有这些并用 util 方法逐个替换它们。 :s :s 对我的应用程序寻找相同的解决方案有很大帮助。在***.com/questions/14293858/… 中提出了几乎相同的问题。 另一个反对票??请解释原因,以便我改进我的答案 我和@giammin 在一起。不要在没有解释的情况下投反对票。【参考方案2】:您可以更改时区...并获取日期
DateTime utcTime = DateTime.UtcNow;
TimeZoneInfo myZone = TimeZoneInfo.FindSystemTimeZoneById("India Standard Time");
DateTime custDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcTime, myZone);
Str.Append(custDateTime.ToString());
【讨论】:
TimezoneInfo 正是我要找的!【参考方案3】:我的指令有问题:
TimeZoneInfo.FindSystemTimeZoneById("India Standard Time");
所以...我创建了一个个人 TimeZoneInfo。
这是我的代码...
public static DateTime DateNow()
DateTime utcTime = DateTime.UtcNow;
TimeZoneInfo myZone = TimeZoneInfo.CreateCustomTimeZone("COLOMBIA", new TimeSpan(-5, 0, 0), "Colombia", "Colombia");
DateTime custDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcTime, myZone);
return custDateTime;
【讨论】:
【参考方案4】:有很简单的方法可以做到这一点。只需在两个不同的变量中获取当前的 UTC 时间和您的时区。然后在第三个变量中将 UTC 转换为您的时区并在任何地方使用它。以下是你的做法。
DateTime date1 = DateTime.UtcNow;
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("Pakistan Standard Time");
DateTime date2 = TimeZoneInfo.ConvertTime(date1, tz);
以 tz 为单位设置您的时区,然后在任何地方使用“date2”。
【讨论】:
【参考方案5】:遇到类似问题(时区),我最终将一些数据库类型从 DateTime
更改为 DateTimeOffset
(MSSql)。
DateTimeOffset Struct
写了一个扩展
public static class Extensions
public static DateTimeOffset ToCentralTime(this DateTimeOffset value)
return TimeZoneInfo.ConvertTime(value, TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time"));
使用示例:
public class ClockPunch
private DateTimeOffset dtoTimeIn;
private DateTimeOffset? dtoTimeOut;
public ClockPunch()
public DateTimeOffset TimeIn
get return dtoTimeIn.ToCentralTime();
set dtoTimeIn = value;
public DateTimeOffset? TimeOut
get
DateTimeOffset? retVal = null;
if (dtoTimeOut != null)
retVal = ((DateTimeOffset)dtoTimeOut).ToCentralTime();
return retVal;
set dtoTimeOut = value;
【讨论】:
【参考方案6】:最好创建一个customTimeZone
public static DateTime DateNow()
DateTime utcTime = DateTime.UtcNow;
TimeZoneInfo myZone = TimeZoneInfo.CreateCustomTimeZone("INDIA", new TimeSpan(+5, +30, 0), "India", "India");
DateTime custDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcTime, myZone);
return custDateTime;
【讨论】:
以上是关于如何更改 asp.net 应用程序的时区的主要内容,如果未能解决你的问题,请参考以下文章