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

问题描述:

我在我的数据库中有一组日期时间,由Javascript new Date()生成。在R中,我将它们读入数据帧中作为character,之后我需要将它们转换为POSIXct日期时间,但我试过的format的任意组合返回NA,任何想法如何解决?感谢将JavaScript日期字符串转换为R使用strptime的POSIXct日期时间

举个例子,这里有一些数据我有:

> 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)") 
> class(datetimes) 
[1] "character" 
> c_datetimes = strptime(datetimes, format = '%a %b %d %Y %H:%M:%S') 
> c_datetimes 
[1] NA NA NA 
+0

*不*使用这种Javasript *字符串*。使用Date的'toJSON()'以明确的ISO8601格式获取日期。其他任何东西都会以这种或那种方式失败。 –

+0

这些字符串是如何生成的?你使用的是哪个数据库?将日期存储为字符串实际上是一个丑陋的错误(出于显而易见的原因)。你能修复产生它们的代码吗?如果数据库实际上包含'datetimeoffset'或'datetime'对象,它可能是您的查询将它们转换为文本? –

首先,数据库应存储的实际日期时间值,不字符串。如果无法修复,则应修改生成数据的代码以返回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%z。文字确保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在冬季。

UPDATE

两个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 

可能是你的本地设置不是英语:

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', tz = "GMT") #choose wichever timezone you like here 
[1] "2016-12-01 13:53:38 GMT" "2016-12-01 13:54:38 GMT" "2016-12-01 13:55:38 GMT" 
+0

不应该使用'%z'来分析偏移量吗?该字符串已经指定了偏移量,不需要假设时区 –