将双精度日期和时间值转换为另一个时区?

GoFaster

我创建了一些代码,以将双精度日期和时间值转换为另一个时区。当使用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;
    }
}

}

马特·约翰逊·品特

您所谓的“双精度日期和时间值”也称为“ OLE自动化日期”或简称为“ OADate”。

OADates不传达任何时区信息。它们只是自1899年12月30日以来某个未知日历中的一点。此外,关于它们的编码方式还有一些奇怪的怪癖(请参阅这些MSDN文档中的说明),这使它们有些不受欢迎。如果可能的话,我会避免使用它们。

但是,您应始终将它们视为未指定。实际上,FromOADate您正在调用方法已经将其返回为Unspecified同类,因此根本没有理由调用DateTime.SpecifyKind简而言之,您的功能应该只是:

public double ConvertTime(double inTime, string sourceTZ, string destTZ)
{
    DateTime sourceDT = DateTime.FromOADate(inTime);
    TimeZoneInfo sourceTZI = TimeZoneInfo.FindSystemTimeZoneById(sourceTZ);
    TimeZoneInfo destTZI = TimeZoneInfo.FindSystemTimeZoneById(destTZ);
    DateTime destDT = TimeZoneInfo.ConvertTime(sourceDT, sourceTZI, destTZI);
    return destDT.ToOADate();
}

但是,如果您的用例要求假设输入时间是计算机的本地时区,那么您将创建一个不同的方法:

public double ConvertFromLocalTime(double inTime, string destTZ)
{
    DateTime sourceDT = DateTime.FromOADate(inTime);
    TimeZoneInfo sourceTZI = TimeZoneInfo.Local;
    TimeZoneInfo destTZI = TimeZoneInfo.FindSystemTimeZoneById(destTZ);
    DateTime destDT = TimeZoneInfo.ConvertTime(sourceDT, sourceTZI, destTZI);
    return destDT.ToOADate();
}

您仍然不需要指定本地种类,因为当将未指定的DateTime值传递给TimeZoneInfo.ConvertTime将假定该值是根据源时区(在这种情况下为您的本地时区)而言的。虽然本地种类可以在这里工作,但这不是必需的。

至于为什么尝试本地类型时出错,我认为这是您遇到的错误:

“转换无法完成,因为所提供的日期时间不正确有那种属性集。例如,当Kind属性为DateTimeKind.Local,源时区必须是TimeZoneInfo.Local。

正如错误所解释的DateTime那样,TimeZoneInfo.ConvertTime除非源时区特别来自否则您不能将local传递DateTimeKind.Local

源时区ID与本地时区ID匹配还不够,因为TimeZoneInfo.Local特殊情况下需要考虑“自动调整夏令时”。有关详细信息,请参见这些MSDN文档换一种说法:

TimeZoneInfo.Local != TimeZoneInfo.FindSystemTimeZoneById(TimeZoneInfo.Local.Id)

最后,我认为您误会了DateTimeKind你说:

确定要正确转换时间,是否必须指定该值是本地时间并且属于某个时区?

“本地”中DateTimeKind.Local和在TimeZoneInfo.Local具体是指本地其中代码运行的计算机这不是一个局部区域,它局部区域。如果将DateTime绑定到UTC或计算机自己的本地时区设置以外的其他时区,则DateTimeKind.Unspecified使用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SQL Server将日期时间转换为另一个时区?

来自分类Dev

moment.js将日期时间从另一个时区转换为UTC

来自分类Dev

在Android中指定GMT格式时,如何将日期和时间从一个时区转换为另一个时区

来自分类Dev

使用joda时间将一个时区转换为另一个时区

来自分类Dev

将时间戳从一个时区转换为另一个时区

来自分类Dev

Python Pandas 日期索引系列日期和时间转换为一个时区到另一个时区

来自分类Dev

Python日期时间从一个本地时区转换为另一个本地时区(+ DST奖励)

来自分类Dev

在Android中将日期时间从一个时区转换为另一个时区

来自分类Dev

将时间(由字符串表示)从一个时区转换为另一个时区

来自分类Dev

Rails:将未来的会议时间在一个时区转换为另一个时区

来自分类Dev

如何将日期从一个时区转换为另一个时区

来自分类Dev

如何将本地时间转换为另一个时区?

来自分类Dev

MongoDB聚合:将日期转换为另一个时区

来自分类Dev

Angular JS:将日期转换为另一个时区

来自分类Dev

OracleSQL 将日期字段转换为另一个时区

来自分类Dev

SAS-将日期时间格式转换为另一个日期时间

来自分类Dev

在VB.NET中如何将MST时区值转换为另一个时区?

来自分类Dev

如何将时间戳字符串转换为另一个时区的时间戳

来自分类Dev

使用Java 8时间将时间从一个时区转换为另一个时区

来自分类Dev

在php中将json日期格式从一个时区转换为另一个时区

来自分类Dev

在php中将json日期格式从一个时区转换为另一个时区

来自分类Dev

用另一个命令的返回值替换bash命令输出中的子字符串(例如,将时间戳转换为日期)

来自分类Dev

如何将DateTimeOffset转换为另一个时区

来自分类Dev

如何将谷歌日历中的全天事件转换为另一个时区?

来自分类Dev

将值从一个javascript函数转换为另一个

来自分类Dev

在Java中将日期从一个时区转换为另一时区

来自分类Dev

将双精度转换为时间(小时和分钟)

来自分类Dev

如何将列转换为以另一个数字列中的值为条件的和?

来自分类Dev

使用JOLT将json数组中的值转换为另一个值

Related 相关文章

  1. 1

    SQL Server将日期时间转换为另一个时区?

  2. 2

    moment.js将日期时间从另一个时区转换为UTC

  3. 3

    在Android中指定GMT格式时,如何将日期和时间从一个时区转换为另一个时区

  4. 4

    使用joda时间将一个时区转换为另一个时区

  5. 5

    将时间戳从一个时区转换为另一个时区

  6. 6

    Python Pandas 日期索引系列日期和时间转换为一个时区到另一个时区

  7. 7

    Python日期时间从一个本地时区转换为另一个本地时区(+ DST奖励)

  8. 8

    在Android中将日期时间从一个时区转换为另一个时区

  9. 9

    将时间(由字符串表示)从一个时区转换为另一个时区

  10. 10

    Rails:将未来的会议时间在一个时区转换为另一个时区

  11. 11

    如何将日期从一个时区转换为另一个时区

  12. 12

    如何将本地时间转换为另一个时区?

  13. 13

    MongoDB聚合:将日期转换为另一个时区

  14. 14

    Angular JS:将日期转换为另一个时区

  15. 15

    OracleSQL 将日期字段转换为另一个时区

  16. 16

    SAS-将日期时间格式转换为另一个日期时间

  17. 17

    在VB.NET中如何将MST时区值转换为另一个时区?

  18. 18

    如何将时间戳字符串转换为另一个时区的时间戳

  19. 19

    使用Java 8时间将时间从一个时区转换为另一个时区

  20. 20

    在php中将json日期格式从一个时区转换为另一个时区

  21. 21

    在php中将json日期格式从一个时区转换为另一个时区

  22. 22

    用另一个命令的返回值替换bash命令输出中的子字符串(例如,将时间戳转换为日期)

  23. 23

    如何将DateTimeOffset转换为另一个时区

  24. 24

    如何将谷歌日历中的全天事件转换为另一个时区?

  25. 25

    将值从一个javascript函数转换为另一个

  26. 26

    在Java中将日期从一个时区转换为另一时区

  27. 27

    将双精度转换为时间(小时和分钟)

  28. 28

    如何将列转换为以另一个数字列中的值为条件的和?

  29. 29

    使用JOLT将json数组中的值转换为另一个值

热门标签

归档