简体   繁体   English

如何在Javascript中将十进制年份值转换为日期?

[英]How do I convert a decimal year value into a Date in Javascript?

OK, this is basically a Javascript version of How can I convert a decimal year value into a Date in Ruby? 好的,这基本上是一个Javascript版本如何将十进制年份值转换为Ruby中的日期? and not exactly a duplicate of Javascript function to convert decimal years value into years, months and days 并且不完全Javascript函数的重复, 以将十进制年份值转换为年,月和日

Input: 输入:

2015.0596924 2015.0596924

Desired output: 期望的输出:

January 22, 2015 2015年1月22日

I have solved it (see below), but I expect (just like the Ruby version of this question) that there is a better way. 我已经解决了它(见下文),但我希望(就像这个问题的Ruby版本)有更好的方法。

JavaScript will resolve the dates for you if you add too much time. 如果您添加太多时间,JavaScript将为您解决日期。 See demonstration below. 见下面的演示。 The solution below doesn't calculate the leap year based on the algorithm, but takes next year's date and subtracts it from this year. 下面的解决方案不会根据算法计算闰年,而是采用明年的日期并从今年开始减去它。 This assumes that the JavaScript specification properly calculates leap years. 这假设JavaScript规范正确计算闰年。

See Mozilla Docs for more info. 有关详细信息,请参阅Mozilla Docs

 function decimalDateToJsDate(time) { var year = Math.floor(time); var thisYear = new Date(year, 0, 1); var nextYear = new Date(year + 1, 0, 1); var millisecondsInYear = nextYear.getTime() - thisYear.getTime(); var deltaTime = Math.ceil((time - year) * millisecondsInYear); thisYear.setMilliseconds(deltaTime); return thisYear; } document.getElementById("output").innerHTML = decimalDateToJsDate(2015.0596924); 
 <pre id="output"></pre> 

The other solution would be: 另一种解决方案是:

  1. Create date for given year (integer part) 创建给定年份的date (整数部分)
  2. Calculate days from reminder (decimal part) and convert to milliseconds 从提醒(小数部分)计算天数并转换为毫秒
  3. Add milliseconds to (1) 添加毫秒到(1)

In script: 在脚本中:

 function leapYear(year) { return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0); }; function convertDecimalDate(decimalDate) { var year = parseInt(decimalDate); var reminder = decimalDate - year; var daysPerYear = leapYear(year) ? 366 : 365; var miliseconds = reminder * daysPerYear * 24 * 60 * 60 * 1000; var yearDate = new Date(year, 0, 1); return new Date(yearDate.getTime() + miliseconds); } var date = convertDecimalDate(2015.0596924); console.log(date); 

You can play with it on this Fiddle . 你可以在这个小提琴上玩它。

function leapYear (year){
  return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
}

function getMonthAndDayFromDayOfYear(dayOfYear, year){
  var daysInMonthArray = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
  if (leapYear(year)) { daysInMonthArray[2] = 29; }

  var daysLeft = dayOfYear;
  var month = 0;
  for (i=0; i<daysInMonthArray.length; i++) {
    var daysInThisMonth = daysInMonthArray[i];
    if (daysLeft > daysInThisMonth) {
      month += 1;
      daysLeft -= daysInThisMonth;
    } else {
      break;
    }
  }
  return { month: month, day: daysLeft };
}

function convertDecimalDate(decimalDate){
  decimalDate = parseFloat(decimalDate);
  var year = parseInt(decimalDate); // Get just the integer part for the year
  var daysPerYear = leapYear(year) ? 366 : 365; // Set days per year based on leap year or not
  var decimalYear = decimalDate - year; // A decimal representing portion of the year left
  var dayOfYear = Math.ceil(decimalYear * daysPerYear); // day of Year: 1 to 355 (or 366)
  var md = getMonthAndDayFromDayOfYear(dayOfYear, year);
  var day = md['day'];
  var month = md['month'];
  return new Date(year,month,day);
}

var date = convertDecimalDate(2015.0596924);

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

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