繁体   English   中英

在javascript中以mm/dd/yyyy格式将十进制年份转换为日期

[英]Convert decimal year to date in javascript in format mm/dd/yyyy

我想通了,经过 looooooooong 研究如何将我的日期变成十进制年份。 现在,我想要做的是弄清楚如何将十进制年份(例如2020.39123转换为11/24/2020类的11/24/2020

我的首选输出格式是mm/dd/yyyy 不是Wed Sep 02 2020 15:24 GMT-0300 (Time zone name)的 long Date() 输出。

到目前为止我的代码是:

function myFunction() {
  var d = Date.parse("March 21, 2012");
  var minutes = 1000 * 60;
  var hours = minutes * 60;
  var days = hours * 24;
  var years = days * 365;
  var y = Math.round(d / years);

  document.getElementById("demo").innerHTML = y;
}

将日期的月份添加到字符串“0”之前,并取最后 2 个字符以将月份作为 2 位数值。 别忘了给月加 1,因为 JS 计数 0-11。 日期的格式化程序相同。 只需在全年结束时添加。

 function myFunction() { let d = new Date("March 21, 2012"); let date = ('0' + (d.getMonth() +1)).slice(-2) + '/' + ('0' + d.getDate()).slice(-2) + '/' + d.getFullYear(); document.getElementById("demo").innerHTML = date; } myFunction();
 <div id='demo'></div>

OP 中的算法很简单,不考虑观察夏令时的非 24 小时天数。 此外,并非所有年份都是 365 天。

更准确的算法会考虑一年中的实际毫秒数并从中创建一个分数。 如果分辨率是整日,则值应四舍五入到下一个整日,小数点后 3 位就足够了。 否则,ECMAScript 数字没有足够的精度来将值保留为毫秒精度,并且十进制年份不会准确地转换回日期(1 毫秒的差异可以将日期更改为不同的日期)。

例如

 // Conversion of a Date to decimal year // Resolution is to day only function toDecimalYear(date) { // Copy date so don't affect original and set to start of day let d = new Date(date); d.setHours(0,0,0,0); let year = d.getFullYear(); let yearStart = new Date(year, 0, 1); let dayNum = Math.round((d - yearStart) / 8.64e7); let daysInYear = Math.round((new Date(year + 1, 0, 1) - yearStart) / 8.64e7); return +(year + dayNum / daysInYear).toFixed(3); } // Convert decimal year to Date // Resolution is to nearest whole day function fromDecimalYear(num) { let year = parseInt(num); let yearStart = new Date(year, 0, 1); let daysInYear = Math.round((new Date(year + 1, 0, 1) - yearStart) / 8.64e7); let dayNum = Math.round((num - year) * daysInYear) yearStart.setDate(1 + dayNum); return yearStart; } // Formatter let f = date => date.toLocaleString('default',{ year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', hour12: false, minute: '2-digit', second: '2-digit', millisecond: 'numeric' }); // OP example console.log('2020.39123 => ' + f(fromDecimalYear(2020.39123))); // Current date - set to start of day let d = new Date(); d.setHours(0,0,0,0); console.log(f(d) + ' = ' + toDecimalYear(d)); // Other test dates [new Date(2012, 0, 1), // 01 Jan 2012 new Date(2012, 2, 12), // 12 Mar 2012 new Date(2012, 11, 31) // 31 Dec 2012 ].forEach(date => { let dy = toDecimalYear(date); console.log( 'Start date : ' + f(date) + '\\nAs decimal years: ' + dy + '\\nBack to date : ' + f(fromDecimalYear(dy)) ) });

我认为使用年表示日期的更好方法是使用 year.dayNumber 而不是小数年。 所以 2020 年 1 月 1 日是 2020.001,2 月 1 日是 2020.032 等。但是年月日是相同数量的字符:20200101、20200201 等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM