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