将Excel时间转换为moment.js

时间:2018-09-29 05:47:22

标签: javascript excel time momentjs

我有一个Electron应用程序,其中需要导入带有两列包含时间值的ExcelSheet。在我的应用程序中,这些值被循环转换为momentjs对象以进行进一步处理:

x['Time'] = moment(x['Time'], ['HH:mm','HH:mm:ss']).format('HH:mm:ss');

只要Excel包含格式化为文本的时间值,此方法就可以正常工作。但是,如果按原本的方式设置Excel,则单元格的值就是0到1之间的数字(Excel在内部将时间作为浮点计数-例如0,5转换为12:00:00)。

有人知道我如何将其转换回momentjs可读的Timevalue吗?

3 个答案:

答案 0 :(得分:2)

据我所知,这与Excel时间十进制值有关。 因此,根据Excel,时间文本由0到1的十进制数表示。

function excelDateToJSDate(excel_date, time = false) {
  let day_time = excel_date % 1
  let meridiem = "AMPM"
  let hour = Math.floor(day_time * 24)
  let minute = Math.floor(Math.abs(day_time * 24 * 60) % 60)
  let second = Math.floor(Math.abs(day_time * 24 * 60 * 60) % 60)
  hour >= 12 ? meridiem = meridiem.slice(2, 4) : meridiem = meridiem.slice(0, 2)
  hour > 12 ? hour = hour - 12 : hour = hour
  hour = hour < 10 ? "0" + hour : hour
  minute = minute < 10 ? "0" + minute : minute
  second = second < 10 ? "0" + second : second
  let daytime = "" + hour + ":" + minute + ":" + second + " " + meridiem
  return time ? daytime : (new Date(0, 0, excel_date, 0, -new Date(0).getTimezoneOffset(), 0)).toLocaleDateString(navigator.language, {}) + " " + daytime
};

首先,我们定义中午时间,然后处理小时,分钟和秒,然后验证给定的小时是AM还是PM,作为一种格式化方式首选项,我们将24小时制更改为12小时制,并在其中添加填充零值小于10,最后以字符串形式返回时间或日期。

示例

function excelDateToJSDate(excel_date, time = false) {
  let day_time = excel_date % 1
  let meridiem = "AMPM"
  let hour = Math.floor(day_time * 24)
  let minute = Math.floor(Math.abs(day_time * 24 * 60) % 60)
  let second = Math.floor(Math.abs(day_time * 24 * 60 * 60) % 60)
  hour >= 12 ? meridiem = meridiem.slice(2, 4) : meridiem = meridiem.slice(0, 2)
  hour > 12 ? hour = hour - 12 : hour = hour
  hour = hour < 10 ? "0" + hour : hour
  minute = minute < 10 ? "0" + minute : minute
  second = second < 10 ? "0" + second : second
  let daytime = "" + hour + ":" + minute + ":" + second + " " + meridiem
  return time ? daytime : (new Date(0, 0, excel_date, 0, -new Date(0).getTimezoneOffset(), 0)).toLocaleDateString(navigator.language, {}) + " " + daytime
};

console.log(excelDateToJSDate(0.125, true));
console.log(excelDateToJSDate(43556));

答案 1 :(得分:0)

export const parseDateExcel = (excelTimestamp) => {
    const secondsInDay = 24 * 60 * 60;
    const excelEpoch = new Date(1899, 11, 31);
    const excelEpochAsUnixTimestamp = excelEpoch.getTime();
    const missingLeapYearDay = secondsInDay * 1000;
    const delta = excelEpochAsUnixTimestamp - missingLeapYearDay;
    const excelTimestampAsUnixTimestamp = excelTimestamp * secondsInDay * 1000;
    const parsed = excelTimestampAsUnixTimestamp + delta;
    return isNaN(parsed) ? null : parsed;
};

用法:

new Date(parseDateExcel(36902.49097)) //=> Thu Jan 11 2001 11:46:59 GMT+0000 (Greenwich Mean Time)

Source

答案 2 :(得分:0)

由于我找不到真正的答案,因此以下是对我有用的答案:

let fromExcel = 0,709722222222222; //translates to 17:02:00
let basenumber = (fromExcel*24)
let hour = Math.floor(basenumber).toString();
if (hour.length < 2) {
    hour = '0'+hour;
}

var minute = Math.round((basenumber % 1)*60).toString();
if (minute.length < 2) {
 minute = '0'+minute;
}
let Timestring = (hour+':'+minute+':00');

所以我有一个字符串momentjs可以翻译。我之所以没有将其标记为答案的原因是,肯定存在更好的转换方式,并且我找不到计算秒数的解决方案(在我的特殊情况下这无关紧要,因为我不使用它们)。