我知道System.TimeZone类以及DateTime.ToString()方法的许多用法.我无法找到的是一种将DateTime转换为字符串的方法,除了时间和日期信息之外,还包含三个字母的Time Zone缩写(事实上,与StackOverflow的相对工具提示大致相同)时间显示工作).
为了让每个人都能轻松地关注和消费,让我们继续使用StackOverflow示例.如果查看相对时间显示的工具提示,它将显示完整日期,时间包括12小时格式的秒数,AM/PM指定,然后是三字母时区缩写(在他们的情况下为Coordinated)世界时间).我意识到我可以通过使用内置方法轻松获得GMT或UTC,但我真正想要的是它本地的时间 - 在这种情况下,在Web服务器上.
如果我们的Web服务器正在运行Windows Server 2k3并且它的时区设置为CST(或者,直到夏令时切换回来,CDT就是它?),我希望我们的ASP.NET Web应用程序显示相对于该时区的DateTimes以及格式化以在结尾显示"CST".我意识到我可以很容易地对其进行硬编码,但为了健壮,我真的更喜欢基于运行代码的OS环境设置的服务器的解决方案.
现在,除了时区缩写,我使用以下代码:
myDateTime.ToString("MM/dd/yyyy hh:mm:ss tt")
哪个显示:
10/07/2008 03:40:31 PM
所有我想要的(并没有多少,许诺!)是这样说的:
10/07/2008 03:40:31 PM CDT
我可以使用System.TimeZone.CurrentTimeZone并使用它来正确显示"Central Daylight Time"但是......为了简洁起见,这有点太长了.我是不是写了一个字符串操作例程来去掉白色空格和任何非大写字母?虽然这可能有用,但这对我来说似乎非常糟糕......
谷歌搜索和环顾四周并没有产生任何适用于我的具体问题.
这是我刚刚解决这个问题的快速黑客方法.
public static String TimeZoneName(DateTime dt) { String sName = TimeZone.CurrentTimeZone.IsDaylightSavingTime(dt) ? TimeZone.CurrentTimeZone.DaylightName : TimeZone.CurrentTimeZone.StandardName; String sNewName = ""; String[] sSplit = sName.Split(new char[]{' '}); foreach (String s in sSplit) if (s.Length >= 1) sNewName += s.Substring(0, 1); return sNewName; }
有一个免费提供的图书馆,TZ4NET,有这些缩写.在.NET 3.5之前,这是在时区之间进行转换的唯一选择之一.
如果你不想要一个单独的库,你当然可以使用TimeZoneInfo类生成合理缩写的映射,然后只提供给你的用户.