我们有一个android应用,它或多或少地只包含一个webview,显示一个webapp。在某个时候,我们想向用户显示一些时间戳,并使用以下代码
let dateString = new Date().toLocaleTimeString();
问题是,即使我们将设备设置为使用24小时制(并且将设备设置为使用24小时制),这始终会产生12小时制(例如使用AM / PM,例如3:15 PM
而不是15:15
)设备确实遵守此设置,因为我们会在状态栏中看到正确的时间)。我们还将设备设置为使用德语,并删除了英语设置。也没有运气。使用设备的语言环境,因为我们的应用以正确的语言显示,但是时间字符串仍然错误。
window.navigator.language -> "de-AT"
new Date().toLocaleTimeString(); -> "6:10:13 PM"
new Date().toLocaleTimeString(window.navigator.language); -> "18:10:32"
乍一看,最后一行似乎是一种可能的解决方法,但是如果语言是例如“ en-US”,则它将始终返回12h格式,无论os是否配置为使用24h时钟。
我知道this问题,该问题似乎与该问题相关,但是答案对我们不起作用。
使用我发现的各种虚拟设备,它仍然可以在chrome 58(在API 26上)上正常工作,但在chrome 61(在API 27上)上不能再使用。目前在chrome 70 beta上进行测试,问题仍然存在。
还要注意的一点是,它可以在chrome本身中正常工作(即,如果我在测试网站中显示时间戳,则使用系统设置),但只能在webview中失败。
我们当前的解决方法是通过本机应用程序生成时间戳,但这似乎很笨拙。
更新
我知道我可以在网络应用程序方面做一些事情,例如覆盖toLocaleTimeString
(实际上,我已经从本地应用程序中获取了正确的格式)。
我的问题更多是关于:本机WebView
中是否存在任何已知的已更改行为(也许可以更改设置来扭转这种情况),因为此问题在具有以下功能的设备上像是一种魅力一样起作用/起作用铬<= 58。
与此同时,我提出了铬问题,他们能够复制铬。也许这会在下一个版本中得到解决...
更新2
该问题已经在Google方面解决,并且可能会在以后的更新中推出。同时,我将继续使用当前对toLocaleTimeString()
的覆盖,它会回调本机应用程序...
答案 0 :(得分:2)
请尝试覆盖函数Date.prototype.toLocaleTimeString
let f = Date.prototype.toLocalString;
Date.prototype.toLocalString = function(){
let s = f();
//since the method fails for US-locale manupulate s as required when locale is US and system is set to show 24 hr
// if ends with AM - just delete "AM"
// if ends with PM - add 12 to hr and delete "PM"
return s;
}
答案 1 :(得分:-1)
覆盖Date.prototype.toLocaleTimeString
let newDate = Date.prototype.toLocalString;
Date.prototype.toLocalString = function(){
let newString = newDate();
//since the method fails for US-locale manupulate s as required when locale is US and system is set to show 24 hr
// if time ends with AM - remove AM
// if time ends with PM - add 12 to hr and remove PM
return newString;
}