Javascript 时间和日期因时区时差而变化

Javascript time and date change by timezone difference in hours

我有这段代码,它可以根据时区差异更改时间和日期,例如 5 小时(由 /////TIME ZONE DIFFERECEN///// 表示),但它没有像我期望的那样工作它到 运行;例如:不更改适用的日期和时间。谁能帮忙。

var dateObj = new Date();
var month = dateObj.getUTCMonth() + 1; //months from 1-12
var day = dateObj.getUTCDate();
var year = dateObj.getUTCFullYear();
var months = ["31"];
if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) {
  months.push("29");
} else {
  months.push("28");
}
monthsappend = ["31", "30", "31", "30", "31", "31", "30", "31", "20", "31"];
months.concat(monthsappend);

time = "7:00pm";

var hours = Number(time.match(/^(\d+)/)[1]);
var minutes = Number(time.match(/:(\d+)/)[1]);
var AMPM = time.match(/\s?([AaPp][Mm]?)$/)[1];
var pm = ['P', 'p', 'PM', 'pM', 'pm', 'Pm'];
var am = ['A', 'a', 'AM', 'aM', 'am', 'Am'];
if (pm.indexOf(AMPM) >= 0 && hours < 12) hours = hours + 12;
if (am.indexOf(AMPM) >= 0 && hours == 12) hours = hours - 12;
var sHours = hours.toString();
var sMinutes = minutes.toString();
if (hours < 10) sHours = "0" + sHours;
if (minutes < 10) sMinutes = "0" + sMinutes;
timearr = [sHours, sMinutes];

timearr[0] += 5;
/////////////////////////////// TIME ZONE DIFFERENCE////////////////////////////

if (time.toLowerCase().includes("pm")) {

}
if (timearr < 0) {
  day -= 1;
  if (day == 0) {
    month -= 1;
    if (month == 0) {
      month = 12;
      year = dateObj.getFullYear() - 1;
    }
    day = months[month - 1];
  }
} else {
  if (timearr => 24) {
    timearr[0] = 24 - timearr[0];
    if (day == months[month - 1]) {
      day = 1;
      month += 1;
      if (month == 12) {
        month = 1;
        year += 1;
      }
    }
  }
}

newdate = day + "/" + month + "/" + year;
console.log(newdate);
console.log(timearr[0]);

嗯,首先我会指出错误:

  • 你有一个箭头函数 => 而不是 greater-than-or-equal-to 运算符 >=(感谢 RobG)。
  • 您将 timearr 视为数组,后来又将其视为单个数字。我想你是想比较 timearr[0].
  • 当您添加 5 小时时,您是在连接字符串。 "19" + 5 === "195"。您需要在此处使用数字,而不是字符串。
  • 您忘记在大 if 语句的第一部分中调整 timearr[0]
  • 在大if的第二段调整timearr[0]时,你有相反的减法。 (24 - 26 === -2,你的意思可能是 26 - 24 === 2)。
  • 最后,您在检查 if (month == 12) 之前递增 month += 1。要么需要在 else 中,要么你必须检查 month === 13.
  • 您在 === 更合适的地方使用了 ==
  • 您在声明 timearr 时忘记了 var
  • 您选择了当前日期,但 hard-coded 时间。

总的来说,您似乎在尝试以 day/month/year 格式在 UTC+5 输出当前日期。有许多更简单的方法可以完成您的要求。例如:

// Get the current moment in time, as a Date object.
var d = new Date();

// Add 5 hours of absolute duration.  The setter handles the bubbling for you.
// Be sure to use UTC here, to avoid interference from transitions of the local time zone.
d.setUTCHours(d.getUTCHours() + 5);

// Get the properties we want to display.
var year = d.getUTCFullYear();
var month = d.getUTCMonth() + 1;
var day = d.getUTCDate();

// Construct the string for output in the desired format.
var s = day + '/' + month + '/' + year;

Moment.js:

var s = moment().utcOffset(5).format('D/M/YYYY');

也请记住 "Time Zone != Offset"。碰巧世界上所有当前使用 UTC+5 的地方都使用它 year-round(例如,巴基斯坦),但如果您谈论的是美国东部时间,则 UTC-5一年中的某些时间段,UTC-4 一年中的其他时间段。