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
一年中的其他时间段。
我有这段代码,它可以根据时区差异更改时间和日期,例如 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
一年中的其他时间段。