Преобразование времени Excel в moment.js - PullRequest
0 голосов
/ 29 сентября 2018

У меня есть приложение Electron, где необходимо импортировать Excel-лист с несколькими столбцами, содержащими значения времени.В моем приложении эти значения преобразуются в цикле в объект 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).

Кто-нибудь знает, как я могу перевести это обратно в читаемое значение времени для момента?

Ответы [ 3 ]

0 голосов
/ 30 сентября 2018

Из-за того, что я не смог найти реальный ответ, вот тот, который работал для меня:

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, которую можно перевести.Причина, по которой я не отмечаю это как ответ, состоит в том, что есть более хорошие способы преобразования, и я не мог найти решение для вычисления секунд (что в моем особом случае не имеет значения, поскольку я их не использую).

0 голосов
/ 14 августа 2019

Это насколько я имею дело с десятичными значениями времени 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));
0 голосов
/ 29 сентября 2018
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)

Источник

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...