C#日期时间:不同时区的转换

10

我有一些日期时间用于跟踪我的应用程序。它们都是以协调世界时 (UTC) 的形式存在的。对于我的应用程序的某个部分,我想发送一封电子邮件,并编辑其中一个时间,使其处于特定的时区。

我仅需要处理两个主要时区,即东海岸和得克萨斯州(达拉斯和休斯顿)

当我发送这封电子邮件时,我也可以创建一个新的日期时间,以获取东部标准时间 (DateTime timestamp = DateTime.Now;)

我的问题是:

如果用户在德克萨斯州地区,我该如何将我的时间从东部时区转换为那里的时间(少1小时)?

我尝试了类似以下的内容:

            //Convert timestamp to local time
            TimeSpan ts = TimeZone.CurrentTimeZone.GetUtcOffset(timestamp);
            timestamp.Add(ts);

            timestampString = timestamp.ToString();

但是那并不起作用。我也知道这一行是无效的:

timestamp.Hour = timestamp.Hour - 1;

1
你应该避免使用DateTime.Now,而是使用DateTime.UtcNow。DateTime.Now可能会在某一天给你带来惊喜,比如错误的时区或错误的夏令时。 - Neil N
7个回答

15

使用TimeZoneInfo类将本地时间转换为另一个时区的时间:

TimeZoneInfo est = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
DateTime targetTime = TimeZoneInfo.ConvertTime(timeToConvert, est);

5
    var now = DateTime.Now; // Current date/time
    var utcNow = now.ToUniversalTime(); // Converted utc time
    var otherTimezone = TimeZoneInfo.FindSystemTimeZoneById("ANY OTHER VALID TIMEZONE"); // Get other timezone
    var newTime = TimeZoneInfo.ConvertTimeFromUtc(utcNow, otherTimezone); // New Timezone

3

这应该可以解决问题。

DateTime localTime = TimeZoneInfo.ConvertTime(DateTime.UtcNow, TimeZoneInfo.Local);

1

0

你可以使用 JavaScript:

 var visitortime = new Date();
    vat time = visitortime.getTimezoneOffset()/60;

接下来,您可以将此值保存到任何设置为 runat="server" 的隐藏控件中。


0
private string IST_DATE(DateTime date)
    {
        if (date != null)
        {
            return TimeZoneInfo.ConvertTimeFromUtc((DateTime)date, TimeZoneInfo.FindSystemTimeZoneById("India Standard Time")).ToString("yyyy-MM-dd");

        }
        return "";

    }

Datetimes是结构体,不能为null。您还将日期转换为DateTime,但它已经声明为Datetime。 - Marie

0
为什么不直接使用以下代码并获取所有可用的时区呢? TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.UtcNow, "AUS Eastern Standard Time");
foreach (TimeZoneInfo tz in TimeZoneInfo.GetSystemTimeZones())
{
    Console.WriteLine(tz.Id);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接