使用strptime将Javascript日期字符串转换为R POSIXct日期时间

时间:2017-02-14 12:17:27

标签: r

我的数据库中有一组日期时间,由Javascript ES6生成。在R中,我将它们作为function callback_b(p) { return function(){ alert('b says'+ p)' } } 读入数据框,之后我需要将它们转换为POSIXct日期时间,但我尝试的test(callback_b("b")) 的任意组合都返回new Date(),任何想法如何修理它?谢谢

例如,以下是我的一些数据:

character

2 个答案:

答案 0 :(得分:4)

首先,数据库应该存储实际的日期时间值,而不是字符串。如果无法解决此问题,则应修改生成数据的代码以返回ISO8601字符串。只需拨打Date.toJSON()或相同的toISOString()即可获得ISO8601表单中的字符串:2017-02-14T12:55:58.376Z

顾名思义,Json日期采用这种格式。所有REST API都期望这样的参数。其他任何事情都只是掩盖了这个问题。

您无法解析当前文本的原因是您可能处于非英语语言环境中。您可以通过将LC_TIME设置为C来停用本地化解析。

执行此操作后,您可以使用'%a %b %d %Y %H:%M:%S GMT%z'格式字符串解析文本。请注意GMT%zGMT字面值确保字符串中忽略GMT%z将解析偏移量。

摘录:

datetimes = c("Thu Dec 01 2016 14:53:38 GMT+0100 (CET)", 
              "Thu Dec 01 2016 14:54:38 GMT+0100 (CET)", 
              "Thu Dec 01 2016 14:55:38 GMT+0100 (CET)")
Sys.setlocale("LC_TIME", "C")
strptime(datetimes, format = '%a %b %d %Y %H:%M:%S GMT%z')

将返回:

[1] "2016-12-01 15:53:38" "2016-12-01 15:54:38" "2016-12-01 15:55:38"

您会注意到偏移量已被考虑在内,以便为我的机器生成正确的本地时间,冬季时间为+2:00。

<强>更新

toJSON()toISOString()都返回UTC时间。如果您想保留偏移信息并且数据是使用Javascript生成的,则可能必须使用moment.js生成带偏移量的字符串as shown here

var m = moment();    // get "now" as a moment
var s = m.format();  // the ISO format is the default so no parameters are needed

// sample output:   2013-07-01T17:55:13-07:00

答案 1 :(得分:2)

您的区域设置可能不是英文:

 var promises = [];

 promises.push(MyService.getPromise().then(function(result) {
    map["A"]["B"] = result;
 }));

 promises.push(MyService.getPromise().then(function(result) {
    map["A"]["C"] = result;
 }));

...

$q.all(promises).then(function() {
  // map is initialized here
})