фонПреобразование UTC в десятичное время
Я хочу, чтобы создать новую систему даты/время на основе старой французской версии с некоторыми изменениями.
Это включает в себя преобразование даты UTC/раз в новых количествах:
- 12 месяцев => 10 месяцев
- 52 недели => 36,5 недель
- 28/31 дней в месяц => 36/37 дней в месяц
- 24 часа => 20 часов
- 60 минут => 100 минут
- 60 секунд => 100 секунд
Я закодировал часы в JavaScript как доказательство концепции, но уверены в том, есть ли я правильно все рассчитали, это дополнительно ли это лучший подход:
Код
1) getDecimalDate() вычисляет день года, затем выдает, какой месяц он существует в новом календаре 36 или 37 дней в месяц. Затем вычисляет новую дату месяца.
function getDecimalDate(date) {
var oldDay = 1000 * 60 * 60 * 24,
startYear = new Date(Date.UTC(date.getUTCFullYear(), 0, 0)),
day = Math.floor((date - startYear)/oldDay),
num = 0,
month = 1;
if (day > 36) { num += 36; month = 2; }
if (day > 73) { num += 37; month = 3; }
if (day > 109) { num += 36; month = 4; }
if (day > 146) { num += 37; month = 5; }
if (day > 182) { num += 36; month = 6; }
if (day > 219) { num += 37; month = 7; }
if (day > 255) { num += 36; month = 8; }
if (day > 292) { num += 37; month = 9; }
if (day > 328) { num += 36; month = 10; }
return { day: day - num, month: month, year: date.getUTCFullYear(), num: num };
}
2) getDecimalTime() вычисляет количество миллисекунд, прошедших с полуночи, а затем изменяет его от старых миллисекунд в день до новых сумм, затем вычисляет часы, минуты и т.д.
function getDecimalTime(date) {
var oldDay = 1000 * 60 * 60 * 24,
newDay = 1000 * 100 * 100 * 20,
startDay = new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate())),
delta = ((date - startDay)/oldDay) * newDay;
var hours = Math.floor(delta/10000000) % 20;
delta -= hours * 10000000;
var minutes = Math.floor(delta/100000) % 100;
delta -= minutes * 100000;
var seconds = Math.floor(delta/1000) % 100;
delta -= seconds * 1000;
var milliseconds = Math.floor(delta) % 1000;
return { milliseconds: milliseconds, seconds: seconds, minutes: minutes, hours: hours };
}
Вы можете увидеть работу версия здесь: https://jsfiddle.net/kmturley/7mrwc3x3/9/
Результаты
Имейте в виду, что я сделал до/названия месяцев день латинскими (Nov = 9, умри = день, декабрь = 10, mense = месяц)
- String - Суббота 3 декабря => Novdie Decmense 10
- Дата - 03-12-2016 => 10-10-2016
- Время - 22:47:52 => 18:98:43
Вопросы
- Is математика правильная?
- Есть ли проблемы с часовыми поясами? я пытался конвертировать все объекты Date в UTC, но JavaScript может быть сложно
- Могу ли я улучшить код? выбор месяца кажется может быть улучшен, но я не мог найти лучшего способа подсчета 36 и 37-дневных месяцев. if (num% 36.5 === 1) не будет работать?
Спасибо!
Update - 7 декабря 2016 - новые версии на основе решения: https://jsfiddle.net/kmturley/7mrwc3x3/10/
https://github.com/kmturley/decimal-time
'есть ли проблемы с часовыми поясами? Я попытался преобразовать все объекты Date в UTC, но JavaScript может быть сложным'. Ну, часовой пояс не более сложный, чем смещение, поэтому я лично буду хранить бит UTC этих функций. – Keith
Все объекты даты ** являются ** UTC. Смещение часового пояса от хоста, методы, отличные от UTC, используют это смещение для вычисления «локальных» значений. Если вы используете все методы UTC, вы получите значения UTC, а смещение часового пояса не будет использовано. – RobG
хороший момент, у меня есть ненужный код, конвертирующий UTC в UTC :) –