0

我正在制作一个 JavaScript mkDate 函数,就像 PHP 所拥有的那样,并且我已经得到了正确的日期,但它比预期的时间短了 5 个小时。我已经盯着这个看了一个小时。这是我的代码:

function mkDate(hour, minute, second, month, day, year)
{
    month--;

    var monthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

    if(new Date(year, 1, 29, 0, 0).getMonth() != 2) { monthDays[1] = 29; }

    var years = year - 1970;
    var leapYears = parseInt((year - 1972)/4);

    var days = (years - leapYears) * 365;
    days += leapYears * 366;

    for(var i = 0; i < month; i++) {
            days += monthDays[i];
    }

    days += day;

    var time = days * 60 * 60 * 24 * 1000;
    time += hour * 60 * 60 * 1000;
    time += minute * 60 * 1000;
    time += second * 1000;

    var tDate = new Date();
    tDate.setTime(time);
    return tDate;
}

var myDate = mkDate(16, 38, 23, 7, 10, 2013);

// myDate should be Wednesday, July 10, 2013 04:38:23 PM
// but myDate is coming up with Wednesday, July 10, 2013 11:38:23 AM
4

2 回答 2

10

时区问题:settime 自 UTC 1970 年 1 月 1 日午夜以来的毫秒数作为参数,并且您提供本地时间。您在 CDT,它位于 UTC 以西 5 小时。

现在,Date 有一个构造函数,它完全采用您提供 mkDate 的字段(但以另一个顺序),因此您的函数可以简化为

function mkDate(hour, minute, second, month, day, year)
{
    return new Date(year,month-1,day,hour, minute, second);
}

并且该日期将是当地时间。

编辑:我错过了在月份字段上减去 1 - Java 和 Javascript 共享的至少一个错误功能......

于 2013-07-13T01:26:30.573 回答
1

为什么不为此使用DateDate.UTC自己的构造函数,如果您的输入预计是UTC时间。这意味着本机函数为您完成所有工作。

function mkDate(hour, minute, second, month, day, year) {
    return new Date(Date.UTC(year, month - 1, day, hour, minute));
}

mkDate(16, 38, 23, 7, 10, 2013);
// Wed Jul 10 2013 17:38:00 GMT+0100 (GMT Daylight Time)

请记住,如果您UTC/GMT使用Date.prototype.toUTCStringDate.prototype.toGMTString

于 2013-07-13T01:34:11.433 回答