English 中文(简体)
在 C# 中指定另一个时区的日期
原标题:Specify a date in another timezone C#

我有一个必须在指定东部夏令时时区每天特定时间运行一些代码的asp.net应用程序。所以我的第一个想法是获取东部时间值并将其转换为本地服务器时间。

所以我需要像这样的东西:

var eastern = DateTime.Today.AddHours(17); // run at 5pm eastern
var timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
var utc = TimeZoneInfo.ConvertTimeToUtc(eastern, timeZoneInfo);
var local = TimeZoneInfo.ConvertTimeFromUtc(utc, TimeZoneInfo.Local);

但我怎么指定东部的DateTime对象应该处于EST时区。

我用错了方法吗?

最佳回答

看起来我能够回答自己的问题。这是我用来获取下一个运行DateTime对象的代码。

    private DateTime GetNextRun()
    {

        var today = DateTime.Today;
        var runTime = new DateTime(today.Year, today.Month, today.Day, 17, 0, 0);
        var timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
        var offset = timeZoneInfo.GetUtcOffset(runTime);
        var dto = new DateTimeOffset(runTime, offset);

        if (DateTime.Now > dto.LocalDateTime) 
            dto = dto.AddDays(1);

        return dto.LocalDateTime;
    }

使用DateTimeOffset而不是DateTime进行所有转换,被证明是有效的。 它甚至似乎正确处理夏令时。

问题回答

首先,你必须考虑几个问题。你必须处理夏令时的变化,这似乎不时会变动(过去10年中开始和结束的日期已更改两次)。所以在北半球的冬季,东部时间是-5格林威治标准时间(或协调世界时)。但是,在夏季,它是-6格林威治标准时间,还是-4格林威治标准时间,我从来就搞不清楚(我也不应该了解)。

有一些DNF库函数用于处理时区信息,但你确实需要.net 3.5来获得最有用的东西。.net 3.5中有TimeZoneInfo类。

TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
DateTime dt = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.Now,
     TimeZoneInfo.IsDaylightSavingsTime(tzi) ? 
        tzi.DaylightName : tzi.StandardName);
if (dt.Hour == 17)
    ....

此外,请记住每年两次会丢失或增加一个小时,因此如果您例如有一个倒计时器来显示“下一个处理的时间”等信息,则还必须考虑这一点。事实上,时间处理并不像一开始想象的那么容易,并且有许多边缘情况。

一个 DateTime 并不知道时区。即使是 DateTimeOffset 也不真正了解时区-它知道UTC即时和相对于该时区的偏移量。

你可以编写自己的结构体,其中包含TimeZoneInfoDateTime,但我不确定在这种情况下是否需要它。你只是想在东部时间安排5点钟吗,还是实际上更加通用?你之后将如何处理DateTime(或其他内容)?使用DateTimeOffsetTimeZoneInfo,你绝对可以得到你感兴趣的UTC时间瞬间;如果你只需要知道“现在”和那个时间之间的时间,这是相当容易的。

我感到有责任指出,当Noda Time准备就绪时,它几乎肯定是正确的答案 :)

您可以使用 DateTime.UtcNow 来获取协调世界时(我认为是格林威治标准时间0),然后找出您想要的时区数量,并为每个时区减去/添加一个小时。





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

热门标签