我正在显示实时日期和时间,但出现错误getDate is not a function
。
我收到此错误是因为我添加了这样的时区
var x = new Date().toLocaleString("en-US", {timeZone: "America/New_York"});
您能在这个问题上帮助我吗?
function calculateUSATime() {
var refresh = 1000; // Refresh rate in milli seconds
mytime = setTimeout('currentUSATime()', refresh)
}
function currentUSATime() {
var x = new Date().toLocaleString("en-US", {
timeZone: "America/New_York"
});
var date = x.getDate();
var month = x.getMonth(); //Be careful! January is 0 not 1
var year = x.getFullYear();
document.getElementById('ct').innerHTML = date;
calculateUSATime();
}
<body onload=currentUSATime();>
<span id='ct'></span>
</body>
答案 0 :(得分:5)
toLocaleString
将返回String
。您可以再次将其传递给date构造函数以获取Date
的实例。根据{{3}}
toLocaleString()
方法返回一个字符串,该字符串具有该日期的语言敏感表示形式
var days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
function calculateUSATime() {
var refresh = 1000; // Refresh rate in milli seconds
mytime = setTimeout('currentUSATime()', refresh)
}
function currentUSATime() {
let str = new Date().toLocaleString("en-US", {
timeZone: "America/New_York"
})
var x = new Date(str);
var date = x.getDate();
var month = x.getMonth(); //Be careful! January is 0 not 1
var year = x.getFullYear();
document.getElementById('ct').innerHTML = days[x.getDay()]+ ' ' + x.toLocaleString();
calculateUSATime();
}
<body onload=currentUSATime();>
<span id='ct'></span>
</body>
您还可以改进它,删除calculateUSATime
并在setTimeout
中使用currentUSATime
。
function currentUSATime() {
let str = new Date().toLocaleString("en-US", {
timeZone: "America/New_York"
})
var x = new Date(str);
var date = x.getDate();
var month = x.getMonth(); //Be careful! January is 0 not 1
var year = x.getFullYear();
document.getElementById('ct').innerHTML = x;
var refresh = 1000; // Refresh rate in milli seconds
mytime = setTimeout(currentUSATime, refresh)
}
<body onload="currentUSATime();">
<span id='ct'></span>
</body>
答案 1 :(得分:2)
正如其他人所述,toLocaleString
返回一个string
,因此您不能将其视为Date
对象。由于您似乎仍然想将其显示为字符串,因此正确的方法是简单地传递所有 all 所需的参数,以所需的格式获取字符串。
例如:
var s = new Date().toLocaleString(undefined, {
timeZone: 'America/New_York',
weekday: 'long',
year: 'numeric',
month: 'numeric',
day: 'numeric',
hour: 'numeric',
minute: 'numeric',
second: 'numeric'
})
这给出了America/New_York
(美国东部时间)的当前时间,使用用户的语言环境进行格式化(undefined
默认为用户的语言环境),并指定工作日的全名应为以及日期和时间的数字格式。
根据用户的语言环境输出示例:
en-US "Thursday, 4/11/2019, 1:13:14 PM"
en-GB "Thursday, 11/04/2019, 13:13:14"
fr-FR "jeudi 11/04/2019 à 13:13:14"
zh-CN "2019年4月11日星期四 下午1:13:14"
您可以阅读the toLocaleString
documentation中的所有选项。
在另一个答案中还建议您可以获取toLocaleString
的输出,然后将其与Date
对象的构造函数进行解析。不建议采用这种方法,原因如下:
ECMAScript规范不是要求这些字符串可以由Date
解析器处理。它仅需要解析符合ISO8601的字符串,例如"2019-04-11T13:13:14"
。其他所有内容(即使看起来像"4/11/2019, 1:13:14 PM"
一样简单)也取决于实现。换句话说,并非所有浏览器都会就如何解析这些字符串达成一致,有些浏览器会拒绝给出Invalid Date
。
Date
对象的解析器将始终使用用户的当前语言环境。因此,如果您在en-US
调用中将语言环境硬编码为toLocaleString
,然后在英国进行了解析,则会错误地翻转月份和日期组成部分。 4月11日将被视为11月4日。
当您使用Date
对象解析一个看起来像本地时间的字符串时,它会正确地假定它位于用户的本地时区中。有后果。考虑到您可能传递的日期和时间在America/New_York
中有效,但在用户的本地时区中无效。例如,2019年3月31日上午1:30在美国有效,但在英国将无效,因为它已落入春季的DST间隔(英国的时钟从00:59提前到02:00,跳过那个小时)。在这种情况下,行为是不确定的。您可能会得到Invalid Date
,或者可能会得到00:30或02:30,但不会得到01:30。
如果确实重建了Date
对象,那么如果用户的时区与给定的时区不同,那么您将创建一个截然不同的时间点。然后,如果您将该Date
对象传递给其他对象,则不会知道您是美国东部时间。最终,Date
对象不跟踪日期,而是保留Unix时间戳,该时间戳与UTC严格相关。的确,Date
这个名称令人困惑且不合适(IMHO)。