Converting Excel Date Serial Number to Date using Javascript

后端 未结 9 1370
终归单人心
终归单人心 2020-11-29 02:22

I have the following javascript code that convert date (string) to the Date Serial Number used in Microsoft Excel:

function JSDateToExcelDate(inDate) {

             


        
9条回答
  •  北荒
    北荒 (楼主)
    2020-11-29 02:57

    It's an old thread but hopefully I can save you the time I used readying around to write this npm package:

    $ npm install js-excel-date-convert

    Package Usage:

    const toExcelDate = require('js-excel-date-convert').toExcelDate;
    const fromExcelDate = require('js-excel-date-convert').fromExcelDate;
    const jul = new Date('jul 5 1998');
    
    toExcelDate(jul);  // 35981 (1900 date system)
    
    fromExcelDate(35981); // "Sun, 05 Jul 1998 00:00:00 GMT"
    

    You can verify these results with the example at https://docs.microsoft.com/en-us/office/troubleshoot/excel/1900-and-1904-date-system

    The Code:

    function fromExcelDate (excelDate, date1904) {
      const daysIn4Years = 1461;
      const daysIn70years = Math.round(25567.5 + 1); // +1 because of the leap-year bug
      const daysFrom1900 = excelDate + (date1904 ? daysIn4Years + 1 : 0);
      const daysFrom1970 = daysFrom1900 - daysIn70years;
      const secondsFrom1970 = daysFrom1970 * (3600 * 24);
      const utc = new Date(secondsFrom1970 * 1000);
      return !isNaN(utc) ? utc : null;
    }
    
    function toExcelDate (date, date1904) {
      if (isNaN(date)) return null;
      const daysIn4Years = 1461;
      const daysIn70years = Math.round(25567.5 + 1); // +1 because of the leap-year bug
      const daysFrom1970 = date.getTime() / 1000 / 3600 / 24;
      const daysFrom1900 = daysFrom1970 + daysIn70years;
      const daysFrom1904Jan2nd = daysFrom1900 - daysIn4Years - 1;
      return Math.round(date1904 ? daysFrom1904Jan2nd : daysFrom1900);
    }
    

    If you want to know how this works check: https://bettersolutions.com/excel/dates-times/1904-date-system.htm

提交回复
热议问题