изменить порядок элементов в объекте POSIXlt и сохранить класс

Предположим

x <- "2012-10-07"

где я конвертирую его в POSIXlt, используя

y <- strptime(x, format = "%Y-%m-%d")

Мне нужно изменить формат на %d/%m/%Y, используя

z <- strftime(y, format = "%d/%m/%Y", tz = "GMT")

Однако это делает объект персонажем.

class(z)
[1] "character"

и когда

as.POSIXlt(z, format = "%d/%m/%Y", tz = "GMT")

распечатанный результат

[1] "2012-10-07 GMT"

(но можно было бы ожидать его в формате %d/%m/%Y).

Есть ли способ преобразовать z в объект POSIXlt/POSIXct и сохранить порядок (печати) %d/%m/%Y? Стоит ли даже беспокоиться об этом, поскольку объект «время» знает, где находятся день, месяц и год, а все остальное только для (красивой) печати?


person Roman Luštrik    schedule 29.10.2014    source источник
comment
Если вам не нравится метод печати, вы можете написать свой собственный. Я не очень понимаю этот вопрос.   -  person Roland    schedule 29.10.2014
comment
@ Роланд, я немного изменил вопрос. Итак, вы говорите, что печать as.POSIXlt по умолчанию равна %Y-%m-%d, и нужно создать собственный метод печати для всего, кроме этого?   -  person Roman Luštrik    schedule 29.10.2014


Ответы (1)


Что-то вроде этого:

x <- "2012-10-07"
y <- strptime(x, format = "%Y-%m-%d")

class(y) <- c("EUtime", class(y))

print.EUtime <- function (x, format="%d/%m/%Y %H:%M:%S", ...) 
{
  max.print <- getOption("max.print", 9999L)
  if (max.print < length(x)) {
    print(format(x[seq_len(max.print)], format = format, usetz = TRUE), ...)
    cat(" [ reached getOption(\"max.print\") -- omitted", 
        length(x) - max.print, "entries ]\n")
  }
  else print(format(x, format = format, usetz = TRUE), ...)
  invisible(x)
}

y
#[1] "07/10/2012 00:00:00 CEST"

Я уверен, что вы можете изменить это самостоятельно, чтобы выводить дату только в полночь.

person Roland    schedule 29.10.2014