【问题标题】:How to Parse Datetime sec.ms如何解析日期时间 sec.ms
【发布时间】:2013-05-07 11:02:02
【问题描述】:

我有一个字符串

1368352924.281610000

介绍DateTime

我该如何解析这个?

试过了:

string rststr = Convert.ToString(result);                       
string[] rststrarr = rststr.Split('.');
DateTime.Parse(rststrarr[0]);

编辑 很抱歉造成混乱。它指出这是一个高分辨率的unix时间戳。 亲切的问候。

【问题讨论】:

  • 你的值应该代表什么日期?除了“它代表日期/时间”之外,您还知道任何细节吗?你知道你是如何从一个特定的日期值得到这个字符串的吗?
  • 基准日期/时间是多少?值 0.0 代表什么 DateTime?
  • @MatthewWatson。使用“基准”一词很好且正确,而不是我的“参考日期”。

标签: c# parsing datetime datetimeoffset


【解决方案1】:

这个数字很可能代表自 1970 年 1 月 1 日 UTC 以来经过的秒数。这是“Unix Epoch”值,在许多系统和日期格式中很常见。

假设我对您拥有的价值类型是正确的,那么您可以执行以下操作:

// you said you were starting with a string
string s = "1368352924.281610000";

// but you are going to need it as a double.
// (If it's already a double, skip these two steps)
var d = double.Parse(s);

// starting at the unix epoch
DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

// simply add the number of seconds that you have
DateTime dt = epoch.AddSeconds(d);


Debug.WriteLine("{0} {1}", dt, dt.Kind);  // prints  05/12/2013 10:02:04 Utc

【讨论】:

  • +1 这是 Unix 纪元,小数点在非常高分辨率下只有几分之一秒
  • 我会更喜欢double.Parsedouble.TryParse 而不是Convert.ToDouble(请参阅Double.TryParse or Convert.ToDouble - which is faster and safer?
  • @MattJohnson。这并没有反映您的答案:问题具体是如何解析毫秒。虽然具体的例子可能是 unix 时代的几秒钟 - 值得指出的是,即使这是一个危险的假设,也不确定(例如,它会很糟糕一年)。问题中没有足够的信息来断然假设。
  • @AndyBrown - 同意,已更新为使用 double.Parse。我对 OP 的输入稳定性知之甚少,无法知道是否需要 TryParse,但他当然可以改用它。 (从最初的问题来看,似乎result 已经是双倍了。)
  • @AndyBrown - 在我看来,OP 对他的输入感到困惑。我先尝试了毫秒,但结果没有意义。由于以秒为单位的值只是发布前一天,我很确定这就是他所拥有的。 (我确实用“很可能”和“假设我是正确的”来限定我的答案......)
【解决方案2】:

您需要TimeSpan.FromMilliseconds,然后将其添加到您的毫秒值所指的参考时间。

例如(编辑 2:假设您的参考日期是 DateTime.MinValue)

double d = double.Parse("1368352924.281610000");
TimeSpan ts = TimeSpan.FromMilliseconds(d);
DateTime dt = DateTime.MinValue.Add(ts);

编辑正如 Wouter Huysentruit 所指出的,有很多方法可以对此进行剥皮。你应该选择一个强调你的场景意图的那个,例如:

DateTime dt = DateTime.MinValue.Add(ts);
dt = DateTime.MinValue + ts;
dt = dateTime.MinValue.AddMilliseconds(d);
dt = DateTime.FromOADate(d);

(后一种见FromOADate

【讨论】:

  • @WouterHuysentruit。确实如此,DateTime.MinValue.AddMilliseconds(d); 也是如此 - 有很多选择!
  • 我同意,意图就是一切 - 更新答案以强调选项
  • 所以日期是16/01/0001 20:05:52?嗯。
  • FromOADate 需要天数,而不是毫秒。上限为 2958465.99999999,OP 编号为 1368352924.281610000。此外,OP 没有指定偏移量。
  • @WouterHuysentruit 完全是我的观点。 :) 没有这些信息就不可能回答这个问题。
猜你喜欢
  • 1970-01-01
  • 2014-01-29
  • 1970-01-01
  • 2010-10-27
  • 2023-03-06
  • 1970-01-01
  • 2013-02-04
  • 2015-07-22
  • 2020-09-04
相关资源
最近更新 更多