时间跨度和UTC

use*_*777 7 .net

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

dev*_*os1 12

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

var dt = new DateTime( timeSpan.Ticks );
var utc = dt.ToUniversalTime();
Run Code Online (Sandbox Code Playgroud)


Pet*_*erJ 6

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

Ali Sepehri.Kh的答案通过使用解决了这个下溢问题.AddDays(1),但是因为对于遵守 DST 的地区,日期始终是 1 月 1 日,因此您最终可能会得到不正确的结果。因为我只对当天的时间跨度感兴趣,所以我最终使用了 Ali 代码的修改版本,该版本使用当前日期作为基础并向其添加 TimeSpan:

public static TimeSpan LocalTimeSpanToUTC(TimeSpan ts)
{
    DateTime dt = DateTime.Now.Date.Add(ts);
    DateTime dtUtc = dt.ToUniversalTime();
    TimeSpan tsUtc = dtUtc.TimeOfDay;
    return tsUtc;
}

public static TimeSpan UTCTimeSpanToLocal(TimeSpan tsUtc)
{
     DateTime dtUtc = DateTime.UtcNow.Date.Add(tsUtc);
     DateTime dt = dtUtc.ToLocalTime();
     TimeSpan ts = dt.TimeOfDay;
     return ts;
}
Run Code Online (Sandbox Code Playgroud)


Ali*_*.Kh 5

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • AddDays(1) 的原因是什么? (4认同)
  • @Miles 我可以回答这个问题,因为我尝试了另一个答案,但没有奏效,因为我处于 +10 UTC 区域,并且无法从 1/1/0001 日期减去任何内容。 (2认同)