Android Webview中的语言环境时间错误

der*_*her 5 javascript android locale google-chrome webview

我们有一个android应用,它或多或少地只包含一个webview,显示一个webapp。在某个时候,我们想向用户显示一些时间戳,并使用以下代码

let dateString = new Date().toLocaleTimeString();
Run Code Online (Sandbox Code Playgroud)

问题是,即使我们将设备设置为使用24h时钟(并且设备确实遵守此设置,因为我们看到的是正确的时间),这也始终会产生12h的时间表示(例如,以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"
Run Code Online (Sandbox Code Playgroud)

乍一看,最后一行似乎是一种可能的解决方法,但是如果语言是“ en-US”,则它将始终返回12h格式,无论os是否配置为使用24h时钟。

我知道这个问题,似乎与这个问题有某种联系,但是答案对我们不起作用。

使用我发现的各种虚拟设备,它仍然可以在chrome 58(在API 26上)上正常工作,但在chrome 61(在API 27上)上不能再使用。目前在chrome 70 beta上进行测试,问题仍然存在。

还需要注意的是,它在chrome本身中可以正常工作(即,如果我在测试网站中显示时间戳,则使用系统设置),但仅在webview中失败。

我们当前的解决方法是通过本机应用程序生成时间戳,但这似乎很笨拙。

更新

我知道我可以在网络应用程序方面做一些事情,例如覆盖toLocaleTimeString(实际上,我已经从本地应用程序中获取了正确的格式)。

我的问题更多是关于:本机中是否存在任何已知的已更改行为(可能是更改此操作的设置),WebView从而导致发生此问题,因为在Chrome <= 58的设备上,此方法的工作原理/魅力很大。

同时,我提出了铬的问题,他们能够复制它。也许这将在下一版本中得到解决...

更新2

该问题已经在Google方面解决,并且可能会在以后的更新中推出。在此期间,我将继续使用我的当前替代,将toLocaleTimeString()其调用回本机应用程序...

may*_*513 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;
}
Run Code Online (Sandbox Code Playgroud)
---请避免直接修改内置 JS 对象的原型 --- 让我也指出,不建议使用 JS 的内置对象,因为它可能会破坏或中断某些外部库的执行。因此,最好创建一个新对象并修改该对象的原型 - 使用原型继承。