我想知道是否有一些聰明的方式來獲取客戶端當前的時間和時區,以便在Shiny應用程序的server.R
部分中使用它。如果沒有,那麼做這件事最簡單的方法是什麼?如何在使用Shiny時檢索客戶端的當前時間和時區?
回答
我發現了一個可以工作的方法,它只是對Reading javascript variable into shiny/R on app load的stackoverflow答案的一個小修改。它不會檢索真正的時區,但也可以檢索時區偏移。
在ui.R
HTML('<input type="text" id="client_time" name="client_time" style="display: none;"> '),
HTML('<input type="text" id="client_time_zone_offset" name="client_time_zone_offset" style="display: none;"> '),
tags$script('
$(function() {
var time_now = new Date()
$("input#client_time").val(time_now.getTime())
$("input#client_time_zone_offset").val(time_now.getTimezoneOffset())
});
')
這上面建立了兩個div
S和JavaScript代碼檢索客戶的時間和時區偏移,並把它們放在div
秒。
在服務器中。ř
client_time <- reactive(as.numeric(input$client_time)/1000) # in s
time_zone_offset <- reactive(as.numeric(input$client_time_zone_offset) * 60) # in s
這上面創建可以在服務器代碼中使用兩個反應性變量。爲了便於處理,我還將ms從input$client_time
轉換爲s和input$client_time_zone_offset
從min到s。
你可以通過套接字通信獲取它,但是開銷很大,或者如果你在客戶端之間的時間是同步的,你可以相信你的本地時間,獲取它們的時區,評估服務器和客戶端之間的時區差異, /減去差異,那麼你可以在沒有太多工作的情況下獲取他們的時間和時區。 (不知何故,但在大多數情況下,通過這樣做,由於計算機保持不變,將失去2至3秒的精度)
我沒有聽說過Shiny,直到您的帖子。通過閱讀文檔,看起來Shiny應用程序的客戶端部分是用R編寫的,但是然後呈現爲HTML/CSS/JavaScript,因此它可以在瀏覽器中運行。您要求的信息必須來自JavaScript。
獲取JavaScript中的當前時間是相當簡單:
var now = new Date();
其結果是,有來自客戶端的時鐘的當前日期和時間Date
對象。在內部,它自UTC時間1970年1月1日午夜起以毫秒爲單位進行跟蹤。但是,在生成輸出時,如.toString()
或使用許多其他功能時,Date
對象將考慮客戶端的本地時區。您可以閱讀MDN reference documentation中Date
對象的更多信息。
現在,如果你真的需要時區的客戶端,那是不同的故事。 Date
對象只能使用.getTimezoneOffset()
函數爲您提供特定日期和時間的時區偏移量。例如,您可以知道客戶端當前距離UTC(UTC-07:00)420分鐘,但您無法知道客戶端在America/Los_Angeles
時區 - UTC-07:00和UTC-08之間交替出現:00夏令時。詳情請參閱the timezone tag wiki。
有一個JavaScript庫,jsTimeZoneDetect,試圖猜測時區,它做了一個合理的體面工作。
所以 - 現在的問題是,如何從R中的Shiny應用程序調用自定義JavaScript?我不是這方面的專家,但似乎覆蓋了this part of the Shiny documentation。
所有這些都將在客戶端完成。然後您必須將它發送到服務器以使用應用程序的server.R部分中的信息。
另一種方式:在任何時候向客戶端發送消息並用輸入對象檢索結果。你也將測量延遲。 (或者如果用戶在閃亮的會話期間更改了時區...)。
獲取服務器時間和時區,通過sendCustomMessage發送給客戶端。
# R
triggerClientTime <- function(session=shiny::getDefaultReactiveDomain()){
serverTime <- Sys.time()
serverTimeZone <- as.integer(strftime(serverTime,"%z"))/100
session$sendCustomMessage(
type="getClientTime",
message=list(
serverPosix = as.numeric(serverTime),
serverTimeZone = serverTimeZone
)
)
}
將此函數放在服務器文件中。
在JavaScript中,得到的消息,檢索偏移時間和區域,將其發送回服務器作爲新的輸入項:
// js
Shiny.addCustomMessageHandler("getClientTime",
function(s){
var d = new Date()
var clientPosix = parseInt(d.getTime()/1000);
var clientTimeZone = -(d.getTimezoneOffset()/60);
var res = {
serverPosix:s.serverPosix,
serverTimeZone:s.serverTimeZone,
clientPosix:clientPosix,
clientTimeZone:clientTimeZone
}
Shiny.onInputChange("clientTime",res)
})
將這個代碼的腳本標記或在一個單獨的js文件。
在閃亮的會話:
# Observe and print time from client and server
observe({
print(input$clientTime)
})
# Ask the client for current time and time zone (hours from UTC)
triggerClientTime()
它應該輸出是這樣的:
# output
$serverPosix
[1] 1449827815
$serverTimeZone
[1] 1
$clientPosix
[1] 1449827816
$clientTimeZone
[1] 1
- 1. 使用ASP.NET檢索客戶端時間
- 2. 瞭解客戶端的當前時間
- 3. 如何在客戶端時區顯示日期和時間
- 4. 記錄時間在客戶端與客戶端時區
- 5. 如何檢測客戶端時區?
- 6. 客戶端的時區獨立時間
- 7. 顯示日期/時間用戶的時區 - 在客戶端
- 8. 根據客戶端時區在sqlserver中存儲當前日期時間
- 9. 如何顯示客戶端時區和時區縮寫?
- 10. 如何在使用PHP檢索當前時間時考慮夏令時?
- 11. 如何檢查當前時間是否在美國時區
- 12. 使用客戶端時間來計算時區
- 13. 如何獲取當地時區的當前日期和時間?
- 14. 時區當前時間
- 15. 時區到當前時間
- 16. 客戶端計算機上的時區和時間未同步
- 17. 保存和檢索從客戶端到數據庫的時間
- 18. 如何使用客戶端時區在客戶端中輸出數據庫時間戳作爲日期戳?
- 19. 如果客戶端時間超前或滯後,如何在客戶端獲得確切的UTC/GMT時間?
- 20. 如何獲得客戶端的時區
- 21. 如何檢查當前登錄的用戶和登錄時間
- 22. 如何使用jQuery獲取給定時區的當前時間
- 23. 從時間服務器檢索當前日期和時間
- 24. 客戶端時間在JavaScript
- 25. 如何在沒有時區和RoR中當前用戶的時區的情況下將時間轉換回UTC?
- 26. 在C中檢索確切的客戶端時間#
- 27. 如何獲取客戶端時區ID?
- 28. 如何獲得客戶端時區
- 29. 如何在使用Python客戶端的InfluxDB中設置時區
- 30. 定時器,時區,服務器端的時間,客戶端倒計時