2

我想做的事情很简单:

    private static TimeZoneInfo Tzi = // ... custom timeZone I've set;
    public static DateTime ToTimeZone(DateTime dateTime, TimeZoneInfo target)
    {
        return TimeZoneInfo.ConvertTime(dateTime, Tzi, target);
    }

想法是——所有到达服务器的日期都会自动转换为特定的时区,并像这样保存到数据库(UTC、美国中部、美国太平洋等)。

只要服务器上设置的时区与 Tzi 相同,这就会很好地工作。但是,如果不是这样,则转换失败 - 创建 DateTime 实例时,.NET 将其设置为机器的 TimeZone,然后 TimeZoneInfo.ConvertTime(dateTime, Tzi, target) 以一种时髦的方式处理我的请求。例如,假设服务器时区是太平洋 (UTC -8),我将 Tzi 设置为中央 (UTC -6),并且我的目标是新加坡 (UTC +8)。

现在,当我调用 TimeZoneInfo.ConvertTime(dateTime, Tzi, target) 首先将 dateTime 从 UTC -8“转换”为 UTC -6(Tzi 时区),增加 2 小时......然后才从 Tzi 到目标。

有没有办法向 TimeZoneInfo.ConvertTime 发出信号,表明我发送的 dateTime 在 TimeZone 中,我作为 from 参数传入,而不是在服务器的 TimeZone 中?

编辑: 好的,两个答案都是很好的建议,但似乎我有不同的麻烦。TimeZoneInfo.ConvertTime(dateTime, Tzi, target) 似乎工作正常,而真正的罪魁祸首实际上是:

return Json(new {data}, JsonRequestBehavior.AllowGet);

输出日期,如:“Created”:“/Date(1346810072950)/”。我已经确认发送日期因服务器上的 TimeZone 而不同(更改服务器的 TimeZone 后需要重新启动 AppPool)。任何人都有这方面的经验并建议如何影响 ASP.NET MVC 以 JSON 格式输出日期并发送回客户端?

4

2 回答 2

3

ConvertTime应该做的工作。也许你的问题是DateTime.Kind.

请参见以下示例:

// Gets current local date
// Returns 04/09/12 11:30 in my case
var date = DateTime.Now;

// Sets DateTime as Unspecified kind (not local nor UTC)
// Returns same date as before, but the date is not tagged as "local"
date = DateTime.SpecifyKind(date, DateTimeKind.Unspecified);

// Converts the current date, specified as UTC+12, into a date specified as UTC-11
// Returns 03/09/12 12:30 in my case, which is the expected result
// (23 hours between previous date and result)
var zz = TimeZoneInfo.ConvertTime(
    date,
    TimeZoneInfo.FindSystemTimeZoneById("UTC+12"),
    TimeZoneInfo.FindSystemTimeZoneById("UTC-11"));
于 2012-09-04T09:28:12.427 回答
2

您可以使用DateTimeOffset代替DateTime- 此结构包含时区偏移属性,因此在创建它的实例时,您应该指定要使用的偏移量。

于 2012-09-04T09:11:12.177 回答