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