【问题标题】:Date parsing. How do I parse this date format? [duplicate]日期解析。如何解析这种日期格式? [复制]
【发布时间】:2017-10-18 13:17:11
【问题描述】:

如何解析这种日期格式:

"/日期(1514728800000+0300)/"

我不知道这个数字是什么意思,也不知道+这个符号是什么意思。

【问题讨论】:

  • 你从哪里得到这些值?
  • 来自我无法访问且无法更改的 Web 服务
  • 第一部分 (1514728800000) 是 unix timestamp - 自 unix 纪元 (1970-01-01T00:00Z) 以来的毫秒数。第二部分 (+0300) 是一个UTC offset,它表示与 UTC 的差异(在这种情况下,比 UTC 提前 3 小时)。但是解析的结果应该是什么? java.util.Date?还有其他对象吗?
  • @Hugo 在我看来很奇怪,将 UTC 偏移量添加到 Unix 时间戳。我认为 Unix 时间戳的目的之一是避免时区问题。 (不是说你错了,事实上你可能是对的。这似乎是相关网络服务做出的一个奇怪的决定。
  • @S.L.Barth 我也觉得很奇怪,但我的猜测是你可以将时间戳转换为指定的偏移量,这样你就会得到一个特定的日期和时间(因为相同的时间戳对应于一个每个时区的不同日期和时间)。但我仍然认为这不是最聪明的格式...

标签: android date date-parsing


【解决方案1】:

部分答案:号码是epoch time

这是自 1970 年 1 月 1 日 UTC 以来的秒数。
您可以将此值传递给java.util.Date 的构造函数,这将为您获取具有正确值的Date 对象。

+0300 不清楚,可能是指不同的时区。

【讨论】:

    【解决方案2】:

    我不确定 +0300,但您可以使用以下函数将纪元时间转换为日期:

     Date date = new Date(Long.parseLong(myDateToParse.replaceAll("[^\\d-]", "")));
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss", Locale.DEFAULT);
    

    【讨论】:

    • 这将创建一个等于15147288000000300long 值,但最后一个数字(0300)不是millis 值的一部分,不应将其传递给Date 构造函数(您的代码会在 481968 年创建一个日期!) - 您应该只传递 1514728800000。而Locale.DEFAULT 不存在,也许你的意思是Locale.getDefault()
    • @Hugo True,我的意思是 Locale.getDefault(),感谢您的输入。至于+0300,我也不得不说你是对的。我在我的示例中尝试做的是解析一个简单的纪元时间(没有 +0300)。您可以简单地删除 +0300 并将 3 小时(使用所需的逻辑)添加到新日期
    • 好吧,如果你愿意,你可以随时 edit 修复/改进你的答案。
    【解决方案3】:

    假设你有 unixtimestamp_zoneoffset

    ,下面是解析这个的代码
    String inputStr = "1514728800000+0300";
    String[] splitStr = inputStr.split("[+-]");
    String offsetSign = inputStr.indexOf("+")>0 ? "+" : "-";
    ZonedDateTime captureTime = Instant.ofEpochMilli(Long.valueOf(splitStr[0])).atZone(ZoneOffset.of(offsetSign+splitStr[1]));
    

    返回值为2017-12-31T17:00+03:00

    【讨论】:

      猜你喜欢
      • 2018-03-07
      • 1970-01-01
      • 1970-01-01
      • 2013-01-09
      • 1970-01-01
      • 1970-01-01
      • 2011-04-30
      • 2020-09-14
      • 2014-09-26
      相关资源
      最近更新 更多