添加时区后,“ getDate不是函数”

时间:2019-04-11 12:07:20

标签: javascript jquery date timezone

我正在显示实时日期和时间,但出现错误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>

2 个答案:

答案 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)。