【问题标题】:How do I convert Epoch time to Date in Open Refine?如何在 Open Refine 中将纪元时间转换为日期?
【发布时间】:2014-11-20 21:19:53
【问题描述】:

我不在乎我使用哪种语言(只要它是 Open Refine 中可用的三种语言之一),但我需要将从 API 返回的时间戳从纪元时间转换为常规日期(参见表达式框下面的截图)。对输出日期格式不太挑剔,只是将日期保留到秒。谢谢!

可以使用:GREL、Jython 或 Clojure。

【问题讨论】:

  • 选择一个环境/语言/绑定(或者在这种情况下不指定)并避免标签垃圾邮件。
  • @user2864740 我选择将所有语言都保留为选项,因为我认为在这种情况下,将数字转换为更重要,而不是担心您使用哪种语言来实现这一点。我正在尝试接触所有了解所有三种语言而不是仅一种语言的人。认为这个问题(和答案)可能对任何使用 Open Refine 的人有用。你会说这不是一个合适的方法吗?
  • @Chiron 我试过什么?谷歌搜索很多,没有答案。我用谷歌搜索了所有三种语言。
  • 在 Clojure 中你会这样做 (java.util.Date. (* 1000 1405742701))
  • @DiegoBasch 嗯...我很难将其转化为可用的东西。我尝试了一些东西,例如(java.util.Date。(* 1000 值))。什么都没有发生。我不知道 Clojure,所以我不确定如何解决这个问题。

标签: date epoch openrefine


【解决方案1】:

如果您必须坚持使用 GREL,您可以使用以下单行:

inc(toDate("01/01/1970 00:00:00","dd/MM/YYYY H:m:s"),value.toNumber(),"seconds").toString('yyyy-MM-dd HH:mm:ss')

分解:

inc(date d, number value, string unit)GREL documentation 中定义:返回在给定时间单位内按给定数量更改的日期。单位默认为“小时”

toDate(o, string format) :返回转换为日期对象的o。 (toDate() 的更复杂用法显示在 GREL documentation 中)

  1. 我们使用字符串 "01/01/1970 00:00:00" 作为 toDate() 的输入来获取 UNIX 纪元(1970 年 1 月 1 日午夜)的开始。

  2. 我们将新创建的日期对象传递给inc(),并将value.toNumber()的结果作为第二个参数(假设值是一个字符串表示自Unix纪元开始以来的秒数),如第三个参数,字符串"seconds",它告诉inc()第二个参数的单位。

  3. 我们最终将生成的日期对象转换为字符串,格式为:yyyy-MM-dd HH:mm:ss

测试数据

以下是使用上述函数将从Timestamp Generator抓取的一系列时间戳转换为字符串日期的结果。

| Name      | Value      | Date String         | 
|-----------|------------|---------------------| 
| Timestamp | 1491998962 | 2017-04-09 12:09:22 | 
| +1 Hour   | 1492002562 | 2017-04-09 13:09:22 | 
| +1 Day    | 1492085362 | 2017-04-10 12:09:22 | 
| +1 Week   | 1492603762 | 2017-04-16 12:09:22 | 
| +1 Month  | 1494590962 | 2017-05-09 12:09:22 | 
| +1 Year   | 1523534962 | 2018-04-09 12:09:22 | 

【讨论】:

    【解决方案2】:

    不幸的是,我不认为你可以用这样或类似的 GREL 语句来做到这一点,但我可能会对能够以某种方式使其工作的其他人感到惊喜:

    value.toDate().toString("dd/MM/yyy")
    

    所以在此期间,使用这个 Jython / Python 代码:

    import time;
    
    # This is a comment.
    # We change 'value' to an integer, since time needs to work with numbers.
    # If we needed to, we could also * 1000 if we had a Unix Epoch Time in seconds, instead of milliseconds.
    
    # We also have no idea what the local time zone is for this, which could affect the date.  But we digress...
    
    epochlong = int(float(value));
    
    datetimestamp = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(epochlong));
    
    return datetimestamp
    

    【讨论】:

      猜你喜欢
      • 2018-04-24
      • 2011-12-06
      • 2012-09-06
      • 2010-10-18
      • 2019-09-19
      • 2017-02-28
      • 1970-01-01
      • 2012-11-08
      • 2019-01-15
      相关资源
      最近更新 更多