如何解决timevis R上的时区问题?

时间:2019-01-15 12:38:18

标签: r shiny posixct

我需要获取timevis返回的数据,但是这些数据返回的时间比输入的数据少一小时。我也尝试过更改R时区和服务器,但这并没有解决问题。 这是我要执行的操作的一个简单示例:

 ui<-fluidPage(

      mainPanel(
      timevisOutput("gantt"),
      tableOutput("return"),
      actionButton("btn","btn")
      )
    )

  server <- function(input, output, session) {



       data <- data.frame(
         id      = 1:4,
         content = c("Item one"  , "Item two"  ,"Ranged item", "Item four"),
         start   = c("2016-01-10 00:00:00", "2016-01-11T00:00:00.000Z", "2016-01-20", "2016-02-14 15:00:00"),
         end     = c(NA          ,           NA, "2016-02-04", NA),
         group   =c(1,1,2,2)
       )




      output$gantt<-renderTimevis({

        timevis(data= data,
               groups = data.frame(id = 1:4, content = c(" 1", " 2", " 3", " 4")),
               options = list(editable = list(add=FALSE, remove=TRUE, updateTime= TRUE, updateGroup=TRUE, overrideItems=TRUE),  align = "left"))

      })

      observeEvent(input$btn,{
        output$return<-renderTable(
              print(input$gantt_data)
        )
      })
    }


    shinyApp(ui, server)

返回input$gantt_data的结果是:

   id     content                    start group                      end
 1  1    Item one 2016-01-09T23:00:00.000Z     1                     <NA>
 2  2    Item two 2016-01-10T23:00:00.000Z     1                     <NA>
 3  3 Ranged item 2016-01-19T23:00:00.000Z     2 2016-02-03T23:00:00.000Z
 4  4   Item four 2016-02-14T14:00:00.000Z     2                     <NA>

1 个答案:

答案 0 :(得分:1)

首先:由于您使用混合日期格式,因此第二个事件无法正确显示。在下面的示例中,我对此进行了纠正。

由于时间轴本身包含正确时区中的日期,因此这只是input$gantt_data返回的对象的问题。您可以通过先将其转换为POSIXct对象,然后在所需的时区中显示它来进行手动更正:

library(timevis)
ui<-fluidPage(

  mainPanel(
    timevisOutput("gantt"),
    tableOutput("return"),
    actionButton("btn","btn")
  )
)

server <- function(input, output, session) {
  data <- data.frame(
    id      = 1:4,
    content = c("Item one"  , "Item two"  ,"Ranged item", "Item four"),
    start   = c("2016-01-10 00:00:00", "2016-01-11 00:00:00.00", "2016-01-20", "2016-02-14 15:00:00"),
    end     = c(NA          ,           NA, "2016-02-04", NA),
    group   =c(1,1,2,2)
  )


  output$gantt<-renderTimevis({
    timevis(data= data,
            groups = data.frame(id = 1:4, content = c(" 1", " 2", " 3", " 4")),
            options = list(editable = list(add=FALSE, remove=TRUE, updateTime= TRUE, updateGroup=TRUE, overrideItems=TRUE),  align = "left"))

  })

  observeEvent(input$btn,{
    output$return<-renderTable({

      dat <- input$gantt_data
      dat$start <- format(as.POSIXct(input$gantt_data$start, format = "%Y-%m-%dT%H:%M:%S", tz = "UTC"), tz="Europe/Berlin")
      dat$end <-   format(as.POSIXct(input$gantt_data$end, format = "%Y-%m-%dT%H:%M:%S", tz = "UTC"), tz="Europe/Berlin")
      print(dat)

    })
  })
}

shinyApp(ui, server)

enter image description here