Javascript Android webview中的区域设置时间错误

Javascript Android webview中的区域设置时间错误,javascript,android,google-chrome,webview,locale,Javascript,Android,Google Chrome,Webview,Locale,我们有一个android应用程序,它或多或少只包含一个网络视图,显示一个网络应用程序。在某些时候,我们希望向用户显示一些时间戳,并使用以下代码 let dateString = new Date().toLocaleTimeString(); 问题是,即使我们将设备设置为使用24小时时钟(并且设备确实遵守此设置,因为我们在状态栏中看到了正确的时间),这也会产生12小时的时间表示(例如,使用AM/PM,例如3:15 PM,而不是15:15)。我们还将设备设置为使用德语,并删除了英语设置。也不走运

我们有一个android应用程序,它或多或少只包含一个网络视图,显示一个网络应用程序。在某些时候,我们希望向用户显示一些时间戳,并使用以下代码

let dateString = new Date().toLocaleTimeString();
问题是,即使我们将设备设置为使用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”,则无论操作系统是否配置为使用24小时时钟,都将始终返回12小时格式

我知道这个问题,它似乎与这个问题有关,但答案对我们不起作用

使用我发现的各种虚拟设备,它在Chrome58(API 26)上仍能正常工作,但在Chrome61(API 27)上不再工作。目前在Chrome70测试版上进行测试,问题仍然存在

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

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

更新

我知道我可以在webapp端做一些事情,比如覆盖
到LocaleTimeString
(事实上,我已经这样做了,以便从本机应用程序获得正确的格式)


我的问题更多的是关于:在本机
WebView
中是否存在导致此问题发生的已知更改行为(以及可能的反转设置),因为这在使用Chrome的设备上非常有效,请尝试覆盖函数Date.prototype.toLocaleTimeString

设f=Date.prototype.toLocalString;
Date.prototype.toLocalString=函数(){
设s=f();
//由于该方法在US语言环境下失败,因此当语言环境为US且系统设置为显示24小时时,请按要求手动操作
//如果以AM结尾-只需删除“AM”
//如果以PM结尾-将12添加到hr并删除“PM”
返回s;

}
我知道确切的输出格式取决于实现。但它至少应该以某种方式反映正确的区域设置,而不是总是使用en-US。它在使用相同代码的chrome浏览器中工作。如果我将区域设置定义为参数,它会起作用。因此,假设这是webview初始化的一个问题是相当省力的。根据规范:“此函数返回一个字符串值。字符串的内容依赖于实现,但旨在表示“时间”当前时区中日期的一部分,以方便的、人类可读的形式,对应于主机环境当前区域设置的约定”。我知道这不是输出的精确规范,但在我看来,在de系统上输出en US约定是违反规范的。特别是如果同一个产品在另一个环境中的行为足够不同,如果您不喜欢输出,请不要使用localeString()s…如果输出的行为像指定的那样,我希望输出。我还有一个变通办法,我觉得这相当笨拙。此外,至少在chrome 58版之前,这一功能也能如期发挥作用。因此,我真的将其视为一个问题(除非有人指出解释此行为变化的官方文件),我的问题的目的是找出是否有其他人偶然发现并解决了此问题,而无需替换每次出现的
toLocaleTimeString
您可以重新定义此方法。例如:
Date.prototype.toLocaleTimeString=function(){返回字符串(this.bold();};新日期().toLocaleTimeString();//使用类似于moment.js的粗体标记
。您也可以使用toISOString()获取24小时版本,但首先需要使用本地时区偏移量来偏移日期,这需要一点数学运算,但并不困难。抱歉,不需要。我想要一个反映系统设置的localeString,即当android设备设置为24小时时钟时获得24小时时间,当android设备设置为12小时时间时获得12小时时间。您的建议总是提供24小时的时间,而且对于上午12:00(在24小时内是00:00,而不是12:00)和下午12:00(在24小时内是12:00,而不是24:00),这是错误的。感谢您指出。很抱歉,我的回答不太清楚。1.焦点-尝试覆盖该方法。2.我已经清楚地写下,只有修改日期时,a。区域设置是日期不反映系统格式(在本例中为US区域设置)和b的区域设置。当系统设置为24小时时。由于您似乎是非常高级的程序员,我还要指出,不建议使用JS的内置对象,因为它可能会中断或中断某些外部库的执行。因此,最好创建一个新对象并修改该对象的原型-使用原型继承。尝试将webchrome客户端与webview客户端一起设置。不确定这对您的情况是否有帮助。setWebChromeClient(新的WebChromeClient());