簡體   English   中英

如何在Javascript中將十進制年份值轉換為日期?

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

好的,這基本上是一個Javascript版本如何將十進制年份值轉換為Ruby中的日期? 並且不完全Javascript函數的重復, 以將十進制年份值轉換為年,月和日

輸入:

2015.0596924

期望的輸出:

2015年1月22日

我已經解決了它(見下文),但我希望(就像這個問題的Ruby版本)有更好的方法。

如果您添加太多時間,JavaScript將為您解決日期。 見下面的演示。 下面的解決方案不會根據算法計算閏年,而是采用明年的日期並從今年開始減去它。 這假設JavaScript規范正確計算閏年。

有關詳細信息,請參閱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> 

另一種解決方案是:

  1. 創建給定年份的date (整數部分)
  2. 從提醒(小數部分)計算天數並轉換為毫秒
  3. 添加毫秒到(1)

在腳本中:

 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); 

你可以在這個小提琴上玩它。

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