我不关心我使用哪种语言(只要它是Open Refine中可用的三种语言之一),但我需要将API从纪元时间返回的时间戳转换为常规语言日期(请参阅下面屏幕截图中的表达框)。对输出日期格式不太挑剔,只是它将日期保留到第二个。谢谢!
可以使用:GREL,Jython或Clojure。
答案 0 :(得分: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)
:返回在给定时间单位内按给定金额更改的日期。单位默认为'小时'
toDate(o, string format)
:返回转换为日期对象的o
。 (GREL documentation)
toDate()
的更复杂用法
我们使用字符串"01/01/1970 00:00:00"
作为toDate()
的输入来获取UNIX纪元的开始(1970年1月1日午夜)。
我们将新创建的日期对象传递给inc()
,并将value.toNumber()
的结果作为第二个参数传递(假设值是自Unix启动以来秒数的字符串表示形式) Epoch),作为第3个参数,字符串"seconds"
告诉inc()
第二个参数的单位。
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 |
答案 1 :(得分:0)
不幸的是,我不认为你可以用这样的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