时间跨度和UTC

时间:2010-07-28 14:34:59

标签: .net

我有一个Timespan变量,它在本地时区有时间但是对于数据库(冷类型时间)我需要传递UTC。我该怎么做呢? 另外,我需要让UTC到本地时间来填充pageLoad上的Timespan变量。 感谢!!!

5 个答案:

答案 0 :(得分:12)

我想我会将TimeSpan加载到DateTime中,然后从DateTime获取通用时间并将其再次转换回来。

var dt = new DateTime( timeSpan.Ticks );
var utc = dt.ToUniversalTime();

答案 1 :(得分:4)

class TimeConversion
{
    public static TimeSpan LocalTimeSpanToUTC(TimeSpan ts)
    {
        DateTime dt = new DateTime(ts.Ticks).AddDays(1);
        DateTime dtUtc = dt.ToUniversalTime();
        TimeSpan tsUtc = dtUtc.TimeOfDay;

        return tsUtc;
    }

    public static TimeSpan UTCTimeSpanToLocal(TimeSpan tsUtc)
    {
        DateTime dtUtc = new DateTime(tsUtc.Ticks).AddDays(1);
        DateTime dt = dtUtc.ToLocalTime();
        TimeSpan ts = dt.TimeOfDay;

        return ts;
    }
}

答案 2 :(得分:3)

TimeSpan LocalTimeToUTCTime(TimeSpan localTime)
{
    var dt = new DateTime(localTime.Ticks);
    var utc = dt.ToUniversalTime();
    return new TimeSpan(utc.Ticks);
}

答案 3 :(得分:1)

我在前几个答案中发现的问题是,从刻度线创建DateTime会导致日期/时间,例如0001-01-01 04:00:00。如果您在框架尝试减去10小时后的时间区域内具有正的UTC偏移,则会低于DateTime.MinValue并且虽然它不会抛出异常,但您最终会得到一个包含{的TimeSpan { {1}}而不是正确的结果。

Ali Sepehri.Kh的答案通过使用00:00:00来解决此下溢问题,但是因为对于观察DST的区域,日期始终是1月1日,您最终可能会得到错误的结果。因为我只对当天的时间跨度感兴趣,所以我最终使用了阿里代码的修改版本,该代码使用当前日期作为基础并将TimeSpan添加到其中:

.AddDays(1)

答案 4 :(得分:0)

今天就参加这个。最好的方法是将TimeSpan添加到DateTime中而没有时间分量。

var dateTimeLocal = DateTime.Today.Add(timeSpan);

DateTimeKind的默认设置为DateTimeKind.Local。将DateTimeKind设置为未指定,因为这实际上不是本地时间(此代码将在其上运行的任何时间),而是本地原始时区中的时间:

var dateTimeUnspecified = DateTime.SpecifyKind(dateTimeLocal, DateTimeKind.Unspecified);

然后将DateTime转换为带有源TimeZoneInfo(原始时间所在的时区)的UTC(这是第二个参数sourceTimeZone):

var utcDateTime = TimeZoneInfo.ConvertTimeToUtc(dateTimeUnspecified, sourceTimeZone);

Voila!