Background
我想创建一个基于旧法语版本的新日期/时间系统,并进行一些修改 .
这涉及将UTC日期/时间转换为新数量:
-
12个月=> 10个月
-
52周=> 36.5周
-
每月28/31天=>每月36/37天
-
24小时=> 20小时
-
60分钟=> 100分钟
-
60秒=> 100秒
我用JavaScript编写了一个时钟作为概念证明,但不确定我是否正确计算了所有内容,另外它是否是最好的方法:
Code
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/
Results
请记住,我使用拉丁语(Nov = 9,die = day,dec = 10,mense = month)组成日/月名称
-
字符串 - 12月3日星期六=> Novdie Decmense 10
-
Date - 03-12-2016 => 10-10-2016
-
时间 - 22:47:52 => 18:98:43
Questions
-
数学是否正确?
-
时区有什么问题吗?我已经尝试将所有Date对象转换为UTC,但JavaScript可能很棘手
-
我可以改进代码吗?月份选择似乎可以改善,但我无法工作?
谢谢!
Update - 7th December 2016 - new versions based on solution: https://jsfiddle.net/kmturley/7mrwc3x3/10/
1 回答
你没有说哪个月有35天,哪个有36天所以我们必须接受if语句是正确的 . 您没有显示如何创建日期,因此可能会或可能不会 . 而且你没有说闰年会发生什么,这个系统似乎每年只有365天 .
下列:
似乎不正确 . 你的意思是:
1天= 20小时
1十进制小时= 100小数分钟
1十进制分钟= 100十进制秒
1十进制秒= 1000十进制毫秒
你在ms中获取时间并缩放到十进制ms的策略似乎很好,我只是做出如下评论 .
在getDecimalTime中,通过首先复制date然后将其UTC小时设置为零来计算startDay更简单:
然后缩放:
所以1标准毫秒= 2.314814814814815十进制毫秒
在日期函数中,表达式为:
将创建一个日期为12月31日的日期(即0日期),如果您在1月1日之后,它应该是:
很可能你有一天出去了 . 否则,代码似乎是正确的 . 对我来说,获取十进制时间函数将更简单: