【问题标题】:Converting a date from DD-MM-YYYY to DD/MM/YYYY in Javascript and finding the difference在 Javascript 中将日期从 DD-MM-YYYY 转换为 DD/MM/YYYY 并找出差异
【发布时间】:2016-03-16 07:44:18
【问题描述】:

我正在尝试将 DD-MM-YYYY 中的日期(从日期选择器字段中获得)转换为 DD/MM/YYYY 并获得两者之间的差异(以年为单位)..

到目前为止我已经尝试过了:

function calcAge()
    {           
      var now = new Date();
      var day = ("0" + now.getDate()).slice(-2);
      var month = ("0" + (now.getMonth() + 1)).slice(-2);
      var today = (day)+"/" + (month) + "/" + now.getFullYear() ;

      var ageday = document.getElementById("datepicker").value.substring(0,2);   
      var agemonth = document.getElementById("datepicker").value.substring(3,5); 
      var ageyear  = document.getElementById("datepicker").value.substring(6,10);
      var tempbday= ageday +"/"+ agemonth +"/"+ ageyear;
      var bday = new Date(tempbday);
      var diff = Math.round(days_between(bday,today)/365);

      //alert(diff);
      //document.getElementById("age").value=diff;
    } 

    function days_between(date1, date2) 
    {

        // The number of milliseconds in one day
        var ONE_DAY = 1000 * 60 * 60 * 24;

        // Convert both dates to milliseconds
        var date1_ms = date1.getTime();
        var date2_ms = date2.getTime();

        // Calculate the difference in milliseconds  
        var difference_ms = Math.abs(date1_ms - date2_ms);

        // Convert back to days and return
        return Math.round(difference_ms/ONE_DAY);

    } 

【问题讨论】:

  • 如果可以的话,我会推荐使用非常简洁的库momentjs.com。使我免于多次头痛。
  • 不要使用Date.parse,只会让人伤心。将值传递给 Date 构造函数。
  • 您的tempobday 错误。 Date.parse 使用美国日期格式,即mm/dd/yyyy。为什么不使用 Date 构造函数?

标签: javascript date


【解决方案1】:

我正在尝试将 DD-MM-YYYY 中的日期(从日期选择器字段中获得)转换为 DD/MM/YYYY

这可以使用简单的替换来完成:

'21-04-2014'.replace(/-/g,'/'); // 21/04/2014

并得到两者之间的差异(以年为单位)

你想怎么做?年可以有 365 天或 366 天,应该用哪个?您想要十进制年、年和日、还是年、月和日的答案?

以下函数将计算两个日期之间的差值。如果您使用精确的参数,它不会将天数四舍五入,并将差值精确到毫秒。请注意,它期望得到 Date 对象,而不是字符串。

见下面的 sn-p

要转换格式为 dd-mm-yyyy 或 dd/mm/yyyy 的字符串,您可以使用:

function parseDMY(s) {
  var b = s.split(/\D+/);
  return new Date(b[2], --b[1], b[0]);
}

要了解 2012 年 1 月 1 日和 2014 年 7 月 22 日之间的差异:

console.log(dateDifference(parseDMY('1-1-2012'), parseDMY('22-7-2014')));
// [2, 6, 21, 0, 0, "0.000"] or 2 years, 6 months, 21 days

在 2012 年 2 月 29 日至 2014 年 3 月 1 日之间(闰年可能比较棘手):

console.log(dateDifference(parseDMY('29-2-2012'), parseDMY('1-3-2014')));
// [2, 0, 1, 0, 0, "0.000"] or 2 years, 0 months, 1 day

在 2014 年 1 月 31 日至 3 月 1 日之间(31 至 30 天的月份也可能很棘手,只需在 2014 年 1 月 31 日加上一个月就等于 2014 年 3 月 3 日):

console.log(dateDifference(parseDMY('31-1-2014'), parseDMY('1-3-2014')));
// [0, 1, 1, 0, 0, "0.000"] or 0 years, 1 month, 1 day

    // Given two date object, return the difference in years, months and days
    // Expects start date to be before end date
    // Default is to deal in whole days. For precise differences 
    // (hours, minutes and seconds), set precise to true
    function dateDifference(start, end, precise) {
      var timeDiff, years, months, days, hours, minutes, seconds;
    
      // Copy date objects so don't modify originals
      var s = new Date(+start);
      var e = new Date(+end);

      // If not precise, set h,m,s to zero
      if (!precise) {
        s.setHours(0,0,0,0);
        e.setHours(0,0,0,0);
      }
    
      // Get estimate of year difference
      years = e.getFullYear() - s.getFullYear();
    
      // Add difference to start, if greater than end, remove one year
      // Note start from restored start date as adding and subtracting years
      // may not be symetric
      s.setFullYear(s.getFullYear() + years);
      if (s > e) {
        --years;
        s = new Date(+start);
        s.setFullYear(s.getFullYear() + years);
      }

      // Allow for leap year: 29-Feb + 1 year -> 1-Mar
      if (start.getDate() != s.getDate()) {
        s.setDate(0);
      }
 
      // Get estimate of months
      months = e.getMonth() - s.getMonth();
      months += months < 0? 12 : 0;
    
      // Add difference to start, adjust if greater
      s.setMonth(s.getMonth() + months);

      if (s > e) {
        --months;
        s = new Date(+start);
        s.setFullYear(s.getFullYear() + years);
        s.setMonth(s.getMonth() + months);
      }

      // Allow for 31 day month rolling over to 1st
      if (start.getDate() != s.getDate()) {
        s.setDate(0);
      }

      // Get remaining time difference
      timeDiff = e - s;
      days     =  timeDiff / 8.64e7 | 0;
      hours    = (timeDiff % 8.64e7) / 3.6e6 | 0;
      minutes  = (timeDiff % 3.6e6) / 6e4 | 0;
      seconds  = ((timeDiff % 6e4) / 1e3).toFixed(3);
      return [years, months, days, hours, minutes, seconds];
    }

// Simple date string parser, doesn't validate values
function parseDMY(s) {
  var b = s.split(/\D/)
  return new Date(b[2], b[1]-1, b[0]);
}

function calcDiff(el) {
  var form = el.form;
  var start = parseDMY(form.startDate.value);
  var end   = parseDMY(form.endDate.value);
  if (isNaN(start) || isNaN(end)) return;
  var diff = dateDifference(start, end);
  document.getElementById('output').innerHTML = diff[0] + ' year'  + (diff[0] == 1? ' ' : 's ') +
                                                diff[1] + ' month' + (diff[1] == 1? ' ' : 's ') +
                                                diff[2] + ' day'   + (diff[2] == 1? '' : 's');
}
<form id="f">
  <table>
    <tr><td>Start date (d/m/y)<td><input name="startDate" value="20/03/2016">
    <tr><td>End date (d/m/y)<td><input name="endDate" value="20/04/2017"> 
    <tr><td><input type="reset"><td><input type="button" onclick="calcDiff(this)" value="Get difference">
  </table>
</form>
<div id="output"></div>      
      

这对于闰年仍有一些问题,正在更新中……

【讨论】:

    【解决方案2】:

    尝试制作两个这样的日期对象

    var date1 = new Date(2010, 6, 17);
    var date2 = new Date(2013, 12, 18);
    var diff = new Date(date2.getTime() - date1.getTime());
    
    console.log(diff.getUTCFullYear() - 1970); // Gives difference as year
    // 3
    
    console.log(diff.getUTCMonth()); // Gives month count of difference
    // 6
    
    console.log(diff.getUTCDate() - 1); // Gives day count of difference
    // 4
    

    【讨论】:

    • 像个魅力伙伴一样工作! :) +1
    • 您意识到new Date(2013, 12, 18) 将创建一个日期为 2014 年 1 月 18 日?
    • 因为答案完全错误。它只是偶然给出一个“正确”的答案。尝试 2014 年 1 月 1 日减去 2013 年 11 月 1 日,您将得到 2 个月 2 天或使用错误的月份数字 2 个月 3 天,而应该是 2 个月 0 天。
    猜你喜欢
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多