我已经创建了一些代码来将双精度日期时间值&转换为另一个时区。它给出的行为我只是不明白什么时候使用DateTimeKind.Local来代替DateTimeKind.Unspecified。将双精度日期和时间值转换为另一个时区?
我的想法是,传入方法ConvertTime的双精度值完全与其地理上下文无关。当然,为了正确地转换时间,有必要指定该值是当地时间并属于某个时区?
我试图确定本地源时间已正确转换为本地目标时间,并观察夏令时,而不考虑主机的时区设置。
从这个概念我尝试以指定
DateTime sourceDT = DateTime.SpecifyKind(inDT, DateTimeKind.Local);
但这会导致不被转换的时间工作。如果我指定
DateTime sourceDT = DateTime.SpecifyKind(inDT, DateTimeKind.Unspecified);
然后发生转换。
有人可以请解释为什么DateTimeKind.Local不被接受为时间转换中的有效规范以及如何实现我正在尝试的内容。
namespace ConvertTime
{
public interface ConvertTimeClass
{
double ConvertTime(double inTime, [MarshalAs(UnmanagedType.LPStr)] string sourceTZ, [MarshalAs(UnmanagedType.LPStr)] string destTZ);
}
public class ManagedClass : ConvertTimeClass
{
public double ConvertTime(double inTime, [MarshalAs(UnmanagedType.LPStr)] string sourceTZ, [MarshalAs(UnmanagedType.LPStr)] string destTZ)
{
DateTime inDT = DateTime.FromOADate(inTime);//convert decimal date and time value to a DateTime object.
DateTime sourceDT = DateTime.SpecifyKind(inDT, DateTimeKind.Unspecified);//specify that the time represents a local time and save into a new object.
TimeZoneInfo sourceTZI = TimeZoneInfo.FindSystemTimeZoneById(sourceTZ);
TimeZoneInfo destTZI = TimeZoneInfo.FindSystemTimeZoneById(destTZ);
DateTime destDT = TimeZoneInfo.ConvertTime(sourceDT, sourceTZI, destTZI);//convert time. FAILS WHEN DateTimeKind.Local is specified
double outTime = destDT.ToOADate();//extract the decimal date & time value
return outTime;
}
}
}