【问题标题】:How to convert date time to double c#如何将日期时间转换为双 C#
【发布时间】:2020-02-13 11:45:26
【问题描述】:

我正在尝试将日期和时间值从 JSON 字符串转换为 C# 中的双精度值,但我不断收到以下错误。

下面是我要调试的代码。

 DateTime baseDate = DateTime.SpecifyKind(DateTime.Parse("1970-01-01"), DateTimeKind.Utc);
 docRoot.scheduleDate = baseDate.AddSeconds((double)docRoot.scheduleDate);

我了解错误的含义,但我一直很难找到解决方法。我尝试了下面的方法,但没有成功。

  1. docRoot.scheduleDate 转换为字符串,然后尝试使用Convert.ToDouble(stringScheduleDate) 将字符串转换为双精度。这里唯一的问题是 docRoot.scheduleDate ("10/10/2019 08:29:30") 中的特殊字符导致格式错误。

我相信,如果我删除特殊字符,我会解决问题。但我想知道是否有不同的方法来克服这个异常?

在我看来,转换为字符串然后删除特殊字符似乎效率低下,所以如果有人愿意贡献一些其他想法,我将不胜感激。

【问题讨论】:

  • 嗨。很想帮忙,但不清楚你在问什么。 JSON解析在哪里?我在您共享的代码中看不到任何内容。 JSON 本身中的示例值是什么样的?仅仅是您的 JSON 包含 Unix 时间戳吗?如果是这样,您是如何将scheduleDate 变成DateTime 的?请考虑将您的问题修改为a minimal, reproducible example。谢谢。

标签: c# json datetime type-conversion double


【解决方案1】:

你应该可以很容易地让 Ticks 翻倍:

docRoot.scheduleDate = baseDate.AddSeconds((double)docRoot.scheduleDate.Second);

我刚刚意识到这是一个添加秒数的方法,这会更好用?

也值得注意。 OADate 在内部也使用私有 InternalTicks 属性。所以这也可能导致问题。

【讨论】:

  • 我尝试了上述方法并且“Newtonsoft.Json.Linq.JValue”不包含“Ticks”异常的定义。这令人困惑,因为我认为 docRoot.scheduleDate 因其格式而被识别为 DateTime 对象。
  • @hfires 是的,在解析为日期时间后在 docRoot 上?
  • 我是这样解析的: DateTime newScheduleDate = Convert.ToDateTime(docRoot.scheduleDate) ,然后尝试 docRoot.scheduleDate = baseDate.AddSeconds((double)newScheduleDate.Seconds);但我收到语法错误
  • 我想通了。它应该是 newScheduleDate.Second(不是 Seconds)。感谢您的帮助!
  • @hfires - 我不明白这是怎么回事。 DateTime 有一个Second 属性,范围从059TimeSpan 有一个Seconds 属性,但它的范围是-5959。我猜您可能关心大于该范围的值。如果你澄清你的问题会有所帮助(见我上面的评论)。谢谢。
【解决方案2】:

使用DateTime.ToOADate 获取十进制表示,按照https://docs.microsoft.com/en-us/dotnet/api/system.datetime.tooadateDateTime.FromOADate 进行反序列化。

【讨论】:

    猜你喜欢
    • 2011-10-05
    • 2011-05-30
    • 2013-06-23
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    相关资源
    最近更新 更多