.net 时间跨度和UTC

.net 时间跨度和UTC,.net,.net,我有一个Timespan变量,它的时间在本地时区,但对于数据库(冷类型时间),我需要传递UTC。我该怎么做? 另外,我需要将UTC设置为本地时间,以便在pageLoad上填充Timespan变量。 谢谢 我想我会将TimeSpan加载到DateTime中,然后从DateTime中获取通用时间并再次将其转换回 var dt = new DateTime( timeSpan.Ticks ); var utc = dt.ToUniversalTime(); 我在前面的几个答案中发现的一个问题是,根据

我有一个Timespan变量,它的时间在本地时区,但对于数据库(冷类型时间),我需要传递UTC。我该怎么做? 另外,我需要将UTC设置为本地时间,以便在pageLoad上填充Timespan变量。
谢谢

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

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

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

答案是通过使用
.AddDays(1)
绕过这个底流。但是,由于观察DST的区域的日期始终是1月1日,因此最终可能会得到错误的结果。因为我只对当天的时间跨度感兴趣,所以我最终使用了阿里代码的修改版本,该版本以当前日期为基础,并将时间跨度添加到其中:

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;
}

今天遇到了这个。最好的方法是将
TimeSpan
添加到不带时间组件的
DateTime

var dateTimeLocal=DateTime.Today.Add(timeSpan);
默认情况下,此项的
DateTimeKind
将设置为
DateTimeKind.Local
。将
DateTimeKind
设置为unspecified,因为这实际上不是本地时间(代码运行的地方),而是原始时区中的时间:

var dateTimeUnspecified=DateTime.SpecifyKind(dateTimeLocal,DateTimeKind.Unspecified);
然后将
日期时间
转换为UTC,并使用源
时区信息
(原始时间的时区)(这是第二个参数
源时区
):

var utcDateTime=TimeZoneInfo.ConvertTimeToUtc(未指定日期时间,源时区);

以下内容无法将8PM eastern正确转换为UTC Dim dt,因为新的日期时间(time.Ticks)dt=dt.ToUniversalTime()Dim dtUniversal作为新的时间跨度(dt.Ticks)这些刻度可能代表不同的东西吗?不同的系统使用不同的刻度表示法——通常是开始计算毫秒的日期。如果您可以将timespan转换为年、月、日等的特定值,则可以从这些值构建DateTime,然后将其转换为UTC。如您所建议的,如何构建DateTime?我在数据库中存储的所有数据都是小时,默认分和秒都是00。我存储的值是01:00:00,如何将其转换为日期时间thanksI将接受这一点,我做了一些更改,但这对我来说是一个很好的起点-Thankst只有在TimeSpan包含了日期组件,而不仅仅是时间的情况下,这才有效。在我的例子中,我将一个TimeOfDay转换为UTC,因此此代码示例将始终生成01/01/0001,而不考虑夏令时。AddDays(1)的原因是什么?@Miles我可以回答这个问题,因为我尝试了另一个答案,但它不起作用,因为我处于+10 UTC区域,它无法从日期1/1/0001减去任何内容。您需要添加“this”作为扩展方法,例如:(this TimeSpan ts),(this TimeSpan tsUtc)
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;
    }
}
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;
}