【问题标题】:Manipulating Date/time with JS and moment用 JS 和时刻操作日期/时间
【发布时间】:2018-12-05 19:38:19
【问题描述】:

我有 2 个日期,我需要使用这 2 个日期创建第三个日期。

if (document.getElementById("endDate"))
endDate = document.getElementById("endDate").value;

if (document.getElementById("presentDate"))
presentDate = document.getElementById("presentDate").value;

如果Present date = "12/5/2018"End date = "12/25/2018" 那么我的New date = "12/26/2018";

由于 JavaScript 日期月份的范围是 0-11,而且日期有点乱,我没有得到想要的结果。

我尝试了什么:

var presentDt = new Date(presentDate);
var endDt = new Date(endDate);

var newDay = endDt.getUTCDate()+1; 
var presentMonth = presentDt.getUTCMonth();
var presentYear = presentDt.getUTCFullYear();
var nextDate= presentMonth + '/' + endDay + '/' + presentYear;
  • 问题 1:上面的代码有效,但如果我的 endDate 是 31 日,则添加 UTCDate+1 使其成为 32,这将返回无效日期。

  • 问题 2:如果我执行 UTCMonth(),它会返回 11,但如果我想添加 2 个月,那么它会返回 13,这也是无效的。问题基本上是我无法随心所欲地操纵日期。

我也试过了,但是我遇到了类似的问题,我无法按照我的意愿轻松地操纵日期。

也尝试过getDategetMonth,但效果相同。

有没有更好的方法来使用 JavaScript 处理整个日期/时间?

【问题讨论】:

    标签: javascript datetime momentjs


    【解决方案1】:

    1:加/减天数: 新日期(新日期().setDate(新日期().getDay() + 3))

    2:加/减月份: 新日期(新日期().setMonth(新日期().getMonth() + 3))

    //your code
    var presentDt = new Date(presentDate);
    var endDt = new Date(endDate);
    
    var newDay = new Date(new Date().setDate(endDt.getDay() + 2)); 
    var presentMonth = presentDt.getUTCMonth();
    var presentYear = presentDt.getUTCFullYear();
    

    【讨论】:

    • 这真是令人困惑。能否请您也添加描述。谢谢。
    • 如果你想增加 2 天:new Date(new Date().setDate(endDt.getDay() + 2));
    • 这只会分别添加月份和日期。我需要同时使用 +1day 和 +1 月来创建一个新的 Date。这里的问题是,一旦我单独执行它然后再次使用 getUTC,它就不再起作用了。
    • var currentDate = new Date(); console.log('currentDate :', currentDate.toUTCString()); var oneDayPlusCurrentDate = new Date(new Date().setDate(currentDate.getDay() + 3)) console.log('currentDate + 1 day:', oneDayPlusCurrentDate.toUTCString()); var oneMonthPlus_withoneDayPlusCurrentDate = new Date(oneDayPlusCurrentDate.setMonth(oneDayPlusCurrentDate.getMonth() + 1)); console.log('currentDate + 1 day + 1 month:', oneMonthPlus_withoneDayPlusCurrentDate.toUTCString());
    • 对于上述代码,请在此处回复://currentDate : Thu, 06 Dec 2018 05:35:05 GMT //currentDate + 1 day: Fri, 07 Dec 2018 05:35:05 GMT // currentDate + 1 天 + 1 个月:星期一,2019 年 1 月 7 日 05:35:05 GMT
    【解决方案2】:

    由于您的输入字符串不是new Date() 跨环境识别的格式,我建议使用moment(String, String) 对其进行解析。

    然后您可以使用moment(Object)、moment's setter(如year()month()date())和format() 来获得所需的输出。

    这是一个现场样本:

    var presentDt = "12/5/2018";
    var endDt = "12/25/2018";
    
    // Parse your input with momentjs
    var mPresent = moment(presentDt, "MM/DD/YYYY");
    var mEnd = moment(endDt, "MM/DD/YYYY");
    
    // Create a new momnt object compliant with your needs
    var nextDate = moment({
      year: mPresent.year(), // get presentDt's year
      month: mPresent.month(), // get presentDt's month
      date: mEnd.add(1, 'day').date() // get endDt day of the month and add 1 day to it
    });
    
    // Display the result in the format you need
    console.log(nextDate.format("MM/DD/YYYY"));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>

    请注意,当endDt 代表该月的最后一天时,您将得到01 作为日结果。

    【讨论】:

    • 这是返回 NAN。除了我已经拥有的库之外,我还需要添加一些库吗?它在这个控制台上工作,但不在我的机器上。
    • 您使用的是哪个时刻版本?无需使用其他库,sn-p 仅使用 momentjs (v2.22.2)
    • 我有你正在使用的同一个,但它显示无效日期。
    • 可能是因为我从日期选择器中选择日期吗?这没有道理。它似乎在我的本地机器上不起作用
    • 所以我更新了 moment(presentDt) .format("MM/DD/YYYY");它返回值,但未设置 nextDate。
    【解决方案3】:

    这就是我所做的:

    首先我创建了以下函数来查看天数和月数。

     function formattedDate(date) {
            var day = date.getDate();
            var monthIndex = date.getMonth();
            var year = date.getFullYear();
    
            return (monthIndex + 1) + '/' + day + '/' + year;
        }
        function myNewDate(datestring) {
            var dates = datestring.split("/");
            var year, month, day;
            if (dates.length < 3) {
                dates = datestring.split("-");
                year = dates[0];
                month = dates[1] - 1;
                day = dates[2];
            } else  {
                year = dates[2];
                month = dates[0] - 1;
                day = dates[1];
            }
    
    
            var days = [31, 28, 31, 30, 31, 30 ,31, 31, 30, 31, 30, 31];
            // Overflow day
            if (day > days[month])
                day = days[month];
    
            return new Date(year, month, day);
        }
        function newDate(date1, date2) {
            var days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
            var year = date1.getFullYear();
            var month = date1.getMonth() + 1;
            var day = date2.getDate() + 1;
    
    
            // Check leap year
            if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
                days[1] = 29;
    
            // Overflow day
            if (day > days[month])
                day = days[month];
    
            var newdate = new Date(year, month, day);
    
            return newdate;
        }
    

    在这里,我使用上述函数来创建我的新日期。您还可以通过更新上述内容来添加/减去天/月。

            var mpresent = myNewDate(presentDate);
            var mstart = myNewDate(startDate);
            var myDate =  (formattedDate(newDate(mpresent, mstart)));
    

    【讨论】:

      猜你喜欢
      • 2017-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-10
      • 2012-05-14
      相关资源
      最近更新 更多