it-roy-ru.com

Получить текущий квартал в году с помощью JavaScript

Как я могу получить текущий квартал, в котором мы находимся с Javascript? Я пытаюсь определить, в каком квартале мы находимся, например. 2.

EDITИ как я могу подсчитать количество дней, оставшихся в квартале?

22
John Doe

Учитывая, что вы не предоставили никаких критериев для определения того, в какой четверти «* мы в настоящее время находимся», можно предложить алгоритм, который необходимо затем адаптировать к любым критериям, которые вам нужны. например.

// For the US Government fiscal year
// Oct-Dec = 1
// Jan-Mar = 2
// Apr-Jun = 3
// Jul-Sep = 4
function getQuarter(d) {
  d = d || new Date();
  var m = Math.floor(d.getMonth()/3) + 2;
  return m > 4? m - 4 : m;
}

Как исполняемый фрагмент, включая год:

function getQuarter(d) {
  d = d || new Date();
  var m = Math.floor(d.getMonth() / 3) + 2;
  m -= m > 4 ? 4 : 0;
  var y = d.getFullYear() + (m == 1? 1 : 0);
  return [y,m];
}

console.log(`The current US fiscal quarter is ${getQuarter().join('Q')}`);
console.log(`1 July 2018 is ${getQuarter(new Date(2018,6,1)).join('Q')}`);

Затем вы можете адаптировать его к различным финансовым или календарным кварталам в зависимости от ситуации. Вы также можете сделать:

function getQuarter(d) {
  d = d || new Date(); // If no date supplied, use today
  var q = [4,1,2,3];
  return q[Math.floor(d.getMonth() / 3)];
}

Затем используйте различные массивы q в зависимости от определения требуемой четверти.

Правка

Ниже приведены оставшиеся в квартале дни, если они начнутся 1 января, апреля, июля и октября. Он протестирован в различных браузерах, включая IE 6 (хотя, поскольку он использует базовый ECMAScript, он должен работать везде):

function daysLeftInQuarter(d) {
  d = d || new Date();
  var qEnd = new Date(d);
  qEnd.setMonth(qEnd.getMonth() + 3 - qEnd.getMonth() % 3, 0);
  return Math.floor((qEnd - d) / 8.64e7);
}
34
RobG

Предполагая, что с января по март считаются Q1 (некоторые страны/компании отделяют свой финансовый год от своего календарного года), следующий код должен работать:

var today = new Date();
var quarter = Math.floor((today.getMonth() + 3) / 3);

Это дает вам:

Month      getMonth()  quarter
---------  ----------  -------
January         0         1
February        1         1
March           2         1
April           3         2
May             4         2
June            5         2
July            6         3
August          7         3
September       8         3
October         9         4
November       10         4
December       11         4

Что касается того, как получить дни, оставшиеся в квартале, это, в основном, вычисление первого дня следующего квартала и определение разницы, что-то вроде:

var today = new Date();
var quarter = Math.floor((today.getMonth() + 3) / 3);
var nextq;
if (quarter == 4) {
    nextq = new Date (today.getFullYear() + 1, 1, 1);
} else {
    nextq = new Date (today.getFullYear(), quarter * 3, 1);
}
var millis1 = today.getTime();
var millis2 = nextq.getTime();
var daydiff = (millis2 - millis1) / 1000 / 60 / 60 / 24;

Это не проверено, но теория обоснована. По сути, создайте дату, соответствующую следующему кварталу, конвертируйте ее и сегодня в миллисекунды с начала эпохи, тогда разница равна количеству миллисекунд.

Разделите это на количество миллисекунд в дне, и вы получите разницу в днях.

Это дает вам (по крайней мере, примерно) количество дней, оставшихся в квартале. Вам может потребоваться точная настройка, чтобы все времена были установлены на одно и то же значение (00:00:00), чтобы разница была в точных днях.

Он также может быть отключен на единицу, в зависимости от вашего фактического определения «дней, оставшихся в квартале».

Но это должно быть хорошей отправной точкой.

53
paxdiablo

если первое решение не работает, то вы можете просто настроить его на нужный вам диапазон

var today = new Date();
var month = now.getMonth();
var quarter;
if (month < 4)
  quarter = 1;
else if (month < 7)
  quarter = 2;
else if (month < 10)
  quarter = 3;
else if (month < 13)
  quarter = 4;
5
Tom Prats

Это сработало для меня! var d = new Date(); quarter = Math.ceil(d.getMonth()/3);

2
Divya

Зависит от месяца

 var date = new Date();     
 var quarter =  parseInt(date.getMonth() / 3 ) + 1 ;

Зависит от даты

 var date = new Date();    
 var firstday = new Date(date.getFullYear(),0,1); // XXXX/01/01
 var diff = Math.ceil((date - firstday) / 86400000); 
 // a quarter is about 365/4 
 quarter =  parseInt( diff / ( 365/ 4 )) + 1 
 // if today is 2012/01/01, the value of quarter  is  1.
2
Shih-En Chou

Он не эффективен и не читабелен, но имеет приятный вкус.

(new Date(new Date().getFullYear(), Math.floor((new Date().getMonth() + 3) / 3) * 3, 1) - new Date()) / 86400000
0
Matas Vaitkevicius