【问题标题】:Date.UTC() returns last day of previous month while getUTCFullYear(), getUTCMonth() returns correctly first day of correct monthDate.UTC() 返回上个月的最后一天,而 getUTCFullYear(), getUTCMonth() 返回正确月份的第一天
【发布时间】:2015-05-05 21:22:24
【问题描述】:

我得到了一个奇怪的结果:

   var date = new Date();
   var year  = date.getMonth() < 11 ? date.getFullYear() : date.getFullYear() + 1;
   var month = date.getMonth() < 11 ? date.getMonth() + 1 : 0;

   console.log(new Date(Date.UTC(year, month)));

   var utcYear = date.getUTCMonth() < 11 ? date.getUTCFullYear() : date.getUTCFullYear() + 1;
   var utcMonth = date.getUTCMonth() < 11 ? date.getUTCMonth() + 1 : 0;

   console.log(new Date(utcYear, utcMonth));

对于我使用的特定日期(任何日期都可以),Date.UTC 给了我:

2015 年 5 月 31 日星期日 19:00:00 GMT-0500(中部夏令时间)

getUTC... 方法给了我:

2015 年 6 月 1 日星期一 00:00:00 GMT-0500(中部夏令时间)

我是误用 Date.UTC 还是遗漏了什么?

谢谢

【问题讨论】:

  • 是的,您在滥用Date.UTC,因为您将本地值传递给它(并且您在滥用new Date,因为您将utc 值传递给它)。你到底想在这里做什么?
  • 感谢您的回复。这是一种以 UTC 时间返回日期对象的角度服务。此代码用于获取下个月的第一天(每月重复出现,直到下个月才能开始)。
  • JS Date 对象没有附加时区,它们只是绝对时间戳。对于显示,您可以使用 UTC 或本地 get…to…String 方法。

标签: javascript date utc


【解决方案1】:

您正在使用 UTC 时间创建一个日期,但是您在本地时间显示它,这就是为什么它晚了几个小时。使用Date.prototype.toUTCString()查看UTC时间

  var date = new Date();
  var year = date.getMonth() < 11 ? date.getFullYear() : date.getFullYear() + 1;
  var month = date.getMonth() < 11 ? date.getMonth() + 1 : 0;

  // It's a UTC date, display it as UTC, not local time
  console.log(new Date(Date.UTC(year, month)).toUTCString());

  var utcYear = date.getUTCMonth() < 11 ? date.getUTCFullYear() : date.getUTCFullYear() + 1;
  var utcMonth = date.getUTCMonth() < 11 ? date.getUTCMonth() + 1 : 0;

  // Created using local time, you can just use the normal toString()
  console.log(new Date(utcYear, utcMonth));

【讨论】:

  • 这不仅仅是一个显示问题。他正在使用 UTC 构建日期,但传递本地时间值(反之亦然),这是错误的。
  • @Bergi 我确实意识到,我没有尝试解释如何正确使用 UTC 或当地时间。在不知道 OP 正在尝试做什么的情况下,我无法尝试谈论它的变量太多。我刚刚解决了我看到的问题:)
  • 感谢您的帮助。所以看起来它只是显示字符串。
  • 为了澄清我不需要显示它只是返回 UTC 中的日期对象。实际使用的日期不是本地日期。试图找出差异。再次感谢大家。
  • @Chris:同样,没有“UTC 中的日期对象”。此答案中的代码仍会生成关闭的 Date 对象。
【解决方案2】:

此代码用于获取下个月的第一天(每月重复出现,直到下个月才能开始)。

那你在找

var today = new Date(); // now

var utcYear = today.getUTCMonth() < 11 ? today.getUTCFullYear() : today.getUTCFullYear() + 1;
var utcMonth = today.getUTCMonth() < 11 ? today.getUTCMonth() + 1 : 0;

var date = new Date(Date.UTC(utcYear, utcMonth)); // next UTC month
console.log(date.toString()); // Mon Jun 01 2015 02:00:00 GMT+0200 
// or, in your timezone:         Sun May 31 2015 19:00:00 GMT-0500 (same moment)
console.log(date.toUTCString()); // Mon, 01 Jun 2015 00:00:00 GMT

顺便说一句,Date 方法确实将太大的值带入 accout(并自动结转它们),所以你只需要这样做

var today = new Date(); // now
var date = new Date(Date.UTC(today.getUTCFullYear(), today.getUTCMonth()+1)); // next UTC month

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    相关资源
    最近更新 更多