簡體   English   中英

將Excel時間轉換為moment.js

[英]Converting Excel Time to moment.js

我有一個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?

據我所知,這與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)); 

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)

資源

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

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');

所以我有一個String momentjs可以翻譯。 我之所以沒有將其標記為答案的原因是,肯定存在更好的轉換方式,並且我找不到計算秒數的解決方案(在我的特殊情況下這無關緊要,因為我不使用它們)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM