使用lubridate的标记日期格式选择了错误的固定格式

时间:2017-05-20 16:21:54

标签: r lubridate

我正在尝试使用stamp包中的lubridate格式化日期输出。我希望结束格式类似于

  

11月1日星期日,23:15

我的问题是要打印未缩短的月份

library(lubridate)
x <- ymd_hm("2017-11-20 15:15")

现在,如果我使用stamp,那么我几乎得到正确的输出

stamp("Sunday, November 30, 23:15")(x)
Multiple formats matched: "%A, %B %d, %y:%H"(1), "%A, %B %y, %d:%H"(1), "Sunday, %B %d, %y:%H"(1), "Sunday, %B %y, %d:%H"(1)
Using: "%A, %B %d, %y:%H"
[1] "Monday, November 20, 17:15"

然而,11月被解释为固定文本,猜测格式使用年和小时代替小时和分钟。如果我添加orders参数,那么我可以尝试强制输入的顺序

stamp("Sunday, Nov 30, 23:15", orders="AbdHM")(x)
Multiple formats matched: "%A, %Om %d, %H:%M"(0), "%A, %b %d, %H:%M"(1)
Using: "%A, %Om %d, %H:%M"
[1] "Monday, 11 20, 15:15"

这里的输出是正确的,除了我将月份作为数字而不是文本。请注意,stamp确实提供了正确的格式,但最终使用了非常正确的格式,尽管给出了相同的匹配。

如何强制stamp使用我提供的确切格式?

[除了使用stamp之外还有其他选项。我只是无法弄清楚为什么上面的代码不起作用]

1 个答案:

答案 0 :(得分:0)

我在GitHub上向lubridate软件包开发人员发布了同样的问题。事实证明上面描述的格式错误是一个现在已修复的错误。我在这里添加答案,因为lubridate的(当前)文档没有提供有关orderslocale参数的大量信息。

如果您的版本为1.6.0.9009或更高lubridate,那么我现在

stamp("Sunday, Nov 30, 23:15", orders="AbdHM")(x)
Multiple formats matched: "%A, %b %d, %H:%M"(1), "%A, %Om %d, %H:%M"(0)
Using: "%A, %b %d, %H:%M"
[1] "Monday, Nov 20, 15:15"

这是所希望的(注意缩写的月份)。如果给出了区域设置或时区,则lubridate的最新版本可以使用

stamp("Sunday, November 1, 16:15", orders="ABdHM")(force_tz(x,  "Europe/Copenhagen"))
Multiple formats matched: "%A, %B %d, %H:%M"(1), "%A, %Om %d, %H:%M"(0)
Using: "%A, %B %d, %H:%M"
[1] "Monday, November 20, 15:15"

也可以通过设置locale参数来获得正确的输出。

stamp("Sunday, November 30, 23:15", "ABdHM", locale = "en_DK.utf8")