关于javascript:datepicker日期关闭一天

datepicker date off by one day

日期选择器返回的日期为一天。 这是我的代码中的问题还是一个错误?

发送到date_picker的日期是2012-03-21。 datepicker返回的日期是2012年3月20日星期二。

1
2
    var end_date = end_calendar.getFormatedDate("%Y-%m-%d");
    end_date = $.datepicker.formatDate('D M dd yy', new Date(end_date));


它不是日期选择器,

1
console.log(new Date('2012-03-21')); //prints Tue Mar 20 2012 20:00:00 GMT-0400 (Eastern Daylight Time)

Javascript Date对象可以接受以下语法之一,如下所示,

  • 新日期()
  • 新日期(毫秒)
  • 新日期(dateString)
  • 新日期(年,月,日[,小时,分钟,秒,毫秒])
  • 所以在你的情况下,它将调用dateString并解析。所以尝试将时间添加如下,

    1
    new Date ('2012-03-21T00:00:00') //should return you Wed Mar 21 2012

    DEMO

    或者更好地使用如下,

    1
    new Date (2012, 2, 21).

    year - 表示年份的整数值。为了兼容性(为了避免Y2K问题),您应该始终指定年份;使用1998年,而不是98年。

    month - 表示月份的整数值,从1月的0开始到12月的11。

    day - 表示月中某天的整数值(1-31)。


    似乎是一个bug。如果发送到Date()的字符串格式为2012/03/21而不是2012-03-21。日期似乎正确。


    您可以将差异添加到日期,这将基本上忽略时区。

    1
    d.setTime( d.getTime() + d.getTimezoneOffset()*60*1000 );


    这不是一个错误,但绝对令人困惑。

    此页面上的大多数答案都很混乱,并包含一些错误信息。

    真正的问题在于javascript Date对象如何解析日期字符串。

    我找到的最佳答案是这个堆栈O答案。看看它的优秀写作。

    以下是上述答案中非常相关的评论。 (信用:@Mizstik)

    All of this is due to the behavior of the underlying Date.parse() trying to follow ISO 8601. When the date string follows the yyyy-mm-dd format, it's assumed to be ISO 8601 with implicit UTC 00:00. When the string deviates from the format (e.g. mm-dd-yyyy or slash instead of hyphen), it falls back to the looser parser according to RFC 2822 which uses local time when the timezone is absent. Admittedly, this will all be quite arcane to an average person.


    我不知道为什么会这样,但我发现你是使用正斜线还是破折号会影响答案。看一看。

    1
    2
    new Date ('2012/03/21'); // returns:"Wed Mar 21 2012 00:00:00 GMT-0500 (CDT)"
    new Date ('2012-03-21'); // returns:"Tue Mar 20 2012 19:00:00 GMT-0500 (CDT)" WHA!

    所以为了解决我的问题,我在输入日期做了一个简单的正则表达式,总是用正斜杠替换前三个破折号。

    1
    2
    3
    4
    5
    6
    7
    var strInputValue = control.value, // <-- get my date string
        dteCurrent;

    strInputValue = strInputValue.replace(/-/, '/')  // replace 1st"-" with"/"
                                 .replace(/-/, '/'); // replace 2nd"-" with"/"

    dteCurrent = new Date(strInputValue);

    我做了一个非常快速的谷歌搜索,为什么会发生这种情况,没有答案。但这应该可以解决您的问题。您需要做的就是在将破折号传递到您想要的位置之前用正斜杠替换破折号。

    编辑:对不起我在发布之前没有注意到已经接受的答案,请忽略这个答案。


    由于时区与日期格式的差异 - yyyy-mm-dd,正在发生这种情况

    1
    2
    3
    new Date ('2015/07/10'); // returns:"Fri Jul 10 2015 00:00:00 GMT-0700 (Pacific Daylight Time)"

    new Date ('2012-07-10'); // returns:"Thu Jul 09 2015 17:00:00 GMT-0700 (Pacific Daylight Time)"

    yyyy/mm/dd - 在计算当地时间时不考虑时区。但是
    yyyy-mm-dd - 在java脚本日期函数中计算本地时间时考虑时间。
    当客户端(浏览器)和服务器时区不同且时区/日期差异为1天时,这可以重现。

    您可以在机器上尝试此操作,方法是将时间更改为时间间隔b / w应> = 12小时的不同时区。


    在尝试了许多解决方案后,以下代码适用于我(https://stackoverflow.com/a/14006555/1736785)

    1
    2
    3
       function createDateAsUTC(date) {
        return new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()));
    }

    1
    2
    var myDate = $.datepicker.parseDate("yy-mm-dd","2013-10-21");
    ..//do whatever with myDate now

    我没有评论的声誉,但Venu M给了我很好的见解。我的项目有同样的问题,根据我日期输入的语法,日期作为输入返回或关闭一天。扩展并查看完整日期格式,我的不同输入日期格式将以UTC或我的本地时区返回,具体取决于语法。我正在使用Moment JS来解析我的日期,然后返回一个日期对象以供Breeze验证。我有一个输入模式或一个要编辑的表,所以现在我需要确保两者都被相同地解析和验证。无论输入语法或输入位置如何,我建议以相同的方式验证日期对象的创建方式。


    在遇到相同的问题并登陆此页面后,在我的情况下,结果是由于日期的无效标签造成的。我星期一开始这周,而不是星期天。我希望这有助于某人。


    检查.getFormatedDate的拼写并将其更改为.getFormattedDate
    这是一个微不足道的变化,但调整它,看看是否有任何夹具结果。


    试试这个,

    1
    2
    3
    4
    5
    6
    7
    8
    ranges": {
        'Today': [moment().hours(0).minutes(0).seconds(0).milliseconds(0), moment().hours(23).minutes(59).seconds(59).milliseconds(999)],
        'Yesterday': [moment().subtract(1, 'days').hours(0).minutes(0).seconds(0).milliseconds(0), moment().subtract(1, 'days').hours(23).minutes(59).seconds(59).milliseconds(999)],
        'Last 7 Days': [moment().subtract(6, 'days').hours(0).minutes(0).seconds(0).milliseconds(0), moment().hours(23).minutes(59).seconds(59).milliseconds(999)],
        'Last 30 Days': [moment().subtract(29, 'days').hours(0).minutes(0).seconds(0).milliseconds(0), moment().hours(23).minutes(59).seconds(59).milliseconds(999)],
        'This Month': [moment().startOf('month').hours(0).minutes(0).seconds(0).milliseconds(0), moment().endOf('month').hours(23).minutes(59).seconds(59).milliseconds(999)],
        'Last Month': [moment().subtract(1, 'month').startOf('month').hours(0).minutes(0).seconds(0).milliseconds(0), moment().subtract(1, 'month').endOf('month').hours(23).minutes(59).seconds(59).milliseconds(999)]
    },

    范围":{
    '今天??':[时刻()。小时(0)。分钟(0)。秒(0)。毫秒(0),时刻()。小时(23)。分钟(59)。秒(59)。毫秒( 999)],
    '昨天':[时刻()。减去(1,'天')。小时(0)。分钟(0)。秒(0)。毫秒(0),时刻()。减去(1,'天') .hours(23).minutes(59).seconds(59).milliseconds(999)],
    '过去7天':[时刻()。减去(6,'天')。小时(0)。分钟(0)。秒(0)。毫秒(0),时刻()。小时(23)。分钟(59).seconds(59).milliseconds(999)],
    '过去30天':[时刻()。减去(29,'天')。小时(0)。分钟(0)。秒(0)。毫秒(0),时刻()。小时(23)。分钟(59).seconds(59).milliseconds(999)],
    '本月':[moment()。startOf('month')。hours(0).minutes(0).seconds(0).milliseconds(0),moment()。endOf('month')。hours( 23).minutes(59).seconds(59).milliseconds(999)],
    '上个月':[时刻()。减去(1,'月')。startOf('月')。小时(0)。分钟(0)。秒(0)。毫秒(0),时刻()。减去(1,'月')。endOf('月')。小时(23)。分钟(59)。秒(59)。毫秒(999)]
    },