Converting Gregorian date to Hijri date - javascript

How do you convert Gregorian dates to Islamic Hijri dates using JavaScript?

function gmod(n,m){
return ((n%m)+m)%m;
}
function kuwaiticalendar(adjust){
var today = new Date();
if(adjust) {
adjustmili = 1000*60*60*24*adjust;
todaymili = today.getTime()+adjustmili;
today = new Date(todaymili);
}
day = today.getDate();
month = today.getMonth();
year = today.getFullYear();
m = month+1;
y = year;
if(m<3) {
y -= 1;
m += 12;
}
a = Math.floor(y/100.);
b = 2-a+Math.floor(a/4.);
if(y<1583) b = 0;
if(y==1582) {
if(m>10) b = -10;
if(m==10) {
b = 0;
if(day>4) b = -10;
}
}
jd = Math.floor(365.25*(y+4716))+Math.floor(30.6001*(m+1))+day+b-1524;
b = 0;
if(jd>2299160){
a = Math.floor((jd-1867216.25)/36524.25);
b = 1+a-Math.floor(a/4.);
}
bb = jd+b+1524;
cc = Math.floor((bb-122.1)/365.25);
dd = Math.floor(365.25*cc);
ee = Math.floor((bb-dd)/30.6001);
day =(bb-dd)-Math.floor(30.6001*ee);
month = ee-1;
if(ee>13) {
cc += 1;
month = ee-13;
}
year = cc-4716;
wd = gmod(jd+1,7)+1;
iyear = 10631./30.;
epochastro = 1948084;
epochcivil = 1948085;
shift1 = 8.01/60.;
z = jd-epochastro;
cyc = Math.floor(z/10631.);
z = z-10631*cyc;
j = Math.floor((z-shift1)/iyear);
iy = 30*cyc+j;
z = z-Math.floor(j*iyear+shift1);
im = Math.floor((z+28.5001)/29.5);
if(im==13) im = 12;
id = z-Math.floor(29.5001*im-29);
var myRes = new Array(8);
myRes[0] = day; //calculated day (CE)
myRes[1] = month-1; //calculated month (CE)
myRes[2] = year; //calculated year (CE)
myRes[3] = jd-1; //julian day number
myRes[4] = wd-1; //weekday number
myRes[5] = id; //islamic date
myRes[6] = im-1; //islamic month
myRes[7] = iy; //islamic year
return myRes;
}
function writeIslamicDate(adjustment) {
var wdNames = new Array("Ahad","Ithnin","Thulatha","Arbaa","Khams","Jumuah","Sabt");
var iMonthNames = new Array("Muharram","Safar","Rabi'ul Awwal","Rabi'ul Akhir",
"Jumadal Ula","Jumadal Akhira","Rajab","Sha'ban",
"Ramadan","Shawwal","Dhul Qa'ada","Dhul Hijja");
var iDate = kuwaiticalendar(adjustment);
var outputIslamicDate = wdNames[iDate[4]] + ", "
+ iDate[5] + " " + iMonthNames[iDate[6]] + " " + iDate[7] + " AH";
return outputIslamicDate;
}
This converts current computer date to hijri. And with a little modification you can achieve that this snippet change any date to islamic
document.write(writeIslamicDate(1));
Taken from This site

If you need only the year of Hijri date converted from Gregorian date (Miladi date) you can simply write this equation in javascript:
var GregorianYear = (new Date()).getFullYear();
var HijriYear = Math.round((GregorianYear - 622) * (33 / 32));
you can use this simple equation in the footer in master page like
كل الحقوق محفوطة لـ ... ©
<script type="text/javascript">document.write((new Date()).getFullYear())</script> م - <script type="text/javascript">var y = (new Date()).getFullYear();var h = Math.round((y - 622) * (33 / 32));document.write(h)</script> هـ
you will get:
كل الحقوق محفوطة لـ ... © 2014 م - 1435 هـ
you can also use C# embedded in asp page as:
<%= DateTime.Now.Year %> - <%= Math.Round((DateTime.Now.Year - 622) * 1.03125) %>
will return : 2014 - 1436
Finally, if you need to convert to UmAlQura date, simply try this line of code:
let _date = new Date('7/10/2019').toLocaleDateString('ar-SA').format('DD/MM/YYYY');
console.log(_date);
will return : ٧‏/١١‏/١٤٤٠ هـ
Update (2021-10-11) : If you need a more precise equation you have to know the current day of solar year by this formula :
var now = new Date();
var start = new Date(now.getFullYear(), 0, 0);
var diff = now - start;
var oneDay = 1000 * 60 * 60 * 24;
var dayOfYear = Math.floor(diff / oneDay);
Then you can get the Hijri year by this formula:
HijriYear = ((GregorianYear-621.5643)*365.24225 + dayOfYear) / 354.36707
Where :
365.24225 is the number of days in solar year.
354.36707 is the number of days in lunar year.
621.5643 is the exact Gregorian date of Hijra (start date of Hijri date)
HijriYear = ((2021-621.5643)*365.24225 + 284) / 354.36707 = 1,443.18444
So the current Hijri year is 1443 by using Math.floor(HijriYear) function.
Also you can use the fraction :
var hijriDayOfYear = (HijriYear - Math.floor(HijriYear)) * 354.36707
0.18444 multiplied by 354.36707 to get the number of days in Hijri calendar :
0.18444 * 354.36707 = 65.3 : the number of day in this current Hijri year
Math.ceil(hijriDayOfYear / 29.530589) = 3 number of current Hijri month
Math.floor(hijriDayOfYear % 29.530589) = 6 ± 1 number of day in this Hijri month
Finally to summarize all of previous just use the following JS code:
var now = new Date()
var dayOfYear = Math.floor((new Date() - new Date(now.getFullYear(), 0, 0)) / (1000 * 60 * 60 * 24))
var hijriDate = ((now.getFullYear()-621.5643)*365.24225 + dayOfYear) / 354.36707
var hijriYear = Math.floor(hijriDate)
var hijriMonth = Math.ceil((hijriDate - Math.floor(hijriDate)) * 354.36707 / 29.530589)
var hijriDay = Math.floor((hijriDate - Math.floor(hijriDate)) * 354.36707 % 29.530589)
console.log(`${hijriYear}/${hijriMonth}/${hijriDay}`)
console output sample : 1443/3/6
General JavaScript Function to convert datetime to Hijri date:
function GetHijriDate(dateTime) {
var dayOfYear = Math.floor((dateTime - new Date(dateTime.getFullYear(), 0, 0)) / (1000 * 60 * 60 * 24))
var hijriDate = ((dateTime.getFullYear() - 621.5643) * 365.24225 + dayOfYear) / 354.36707
var hijriYear = Math.floor(hijriDate)
var hijriMonth = Math.ceil((hijriDate - Math.floor(hijriDate)) * 354.36707 / 29.530589)
var hijriDay = Math.floor((hijriDate - Math.floor(hijriDate)) * 354.36707 % 29.530589)
return [hijriYear, hijriMonth , hijriDay]
}
In C# :
/// <summary>
/// Gets the hijri date.
/// </summary>
/// <param name="date">The date.</param>
/// <returns></returns>
public static int[] GetHijriDate(DateTime date)
{
var yearOfHijra = 621.5643f;
var daysInSolarYear = 365.24225f;
var daysInLunarYear = 354.36707f;
var daysInLunarMonth = 29.53058f;
var hijriDate = ((date.Year - yearOfHijra) * daysInSolarYear + date.DayOfYear) / daysInLunarYear;
var hijriYear = (int)Math.Floor(hijriDate);
var hijriMonth = (int)Math.Ceiling((hijriDate - Math.Floor(hijriDate)) * daysInLunarYear / daysInLunarMonth);
var hijriDay = (int)Math.Floor((hijriDate - Math.Floor(hijriDate)) * daysInLunarYear % daysInLunarMonth);
int[] hijriDateRes = new int[3];
hijriDateRes[0] = hijriYear;
hijriDateRes[1] = hijriMonth;
hijriDateRes[2] = hijriDay;
return hijriDateRes;
}
Or Simply :
console.log(new Date().toLocaleDateString('ar-SA'))
'٥‏/٣‏/١٤٤٣ هـ'

Checkout my library hijrah-date which is a Javascript date in the Hijrah calendar system.
It also supports Hijrah to Gregorian and Gregorian to Hijrah conversion. In addition to date formatting.

The safest is to use the built-in javascript Intl.DateTimeFormat() constructor.
Here is an example of the 4 output formats in the Islamic Hijri Calendar of today's date.
Also examples of extracting the year and months separately under different formats.
let myFormat = 'en-u-ca-islamic-umalqura-nu-latn'; // use islamic-umalqura calendar (most modern)
let myDate = new Date(Date.now()); // today's date
let output = new Intl.DateTimeFormat(myFormat,{dateStyle:'full'}).format(myDate);
console.log("Full format : "+output);
output = new Intl.DateTimeFormat(myFormat,{dateStyle:'long'}).format(myDate);
console.log("Long format : "+output);
output = new Intl.DateTimeFormat(myFormat,{dateStyle:'medium'}).format(myDate);
console.log("Medium format : "+output);
output = new Intl.DateTimeFormat(myFormat,{dateStyle:'short'}).format(myDate);
console.log("Short format (m/d/yyyy): "+output);
console.log("=".repeat(50));
let yearFull = new Intl.DateTimeFormat(myFormat,{year:'numeric'}).format(myDate);
console.log("The full year : "+yearFull);
console.log("The year number : " +(+yearFull.split(" ")[0]));
let monthLong = new Intl.DateTimeFormat(myFormat,{month:'long'}).format(myDate);
let monthShort = new Intl.DateTimeFormat(myFormat,{month:'short'}).format(myDate);
let monthNum = new Intl.DateTimeFormat(myFormat,{month:'numeric'}).format(myDate);
let month2 = new Intl.DateTimeFormat(myFormat,{month:'2-digit'}).format(myDate);
console.log("The long month : "+monthLong);
console.log("The short month : "+monthShort);
console.log("The month number : "+monthNum);
console.log("The month 2 digits: "+month2);

In Javascript to convert the date, you could use Intl (read more) as following:
a = new Date();
localeFormat= 'ar-SA-islamic-umalqura';
Intl.DateTimeFormat(localeFormat).format(a)

Related

How to get past 7 days and next 7 days in Javascript

I'm trying to get past 7 days and next 7 days date start data and end date using javascript date function.
For example : Today 31 march 2017 , When i click previous button, it will calculate from previous date ie: start and end date , (24 March 2017 to 30 March 2017) , again click previous (17 March 2017 to 23 March 2017)etcc..
Same thing will replicate for next button ..
I have tried the below things but its not working
function getPreviousWeek(){
ProHistoryCtrl.weekPrevcount = ProHistoryCtrl.weekPrevcount + 1;
ProHistoryCtrl.weekPrevious = (-6 * ProHistoryCtrl.weekPrevcount);
getByWeek();
}
function getNextWeek(){
ProHistoryCtrl.weekPrevcount = ProHistoryCtrl.weekPrevcount - 1;
ProHistoryCtrl.weekPrevious = (-6 * ProHistoryCtrl.weekPrevcount);
getByWeek();
}
function getByWeek(){
console.log("weekpreviouscount" + ProHistoryCtrl.weekPrevcount); //-6,-12,-18,-24
console.log("weekprevious" + ProHistoryCtrl.weekPrevious); //-6,-12,-18,-24
var d2 = new Date(); // 31.01.2017
var d1 = new Date(d2);
d1.setDate(d2.getDate() - 1); // 30.01.2017
var previousWeek = '';
var current_day = '';
console.log("d2date" + d1.getDate());
console.log("week2" + ProHistoryCtrl.weekPrevious)
previousWeek = new Date(d1);
previousWeek.setDate(d1.getDate() + ProHistoryCtrl.weekPrevious); // 30-13=17
current_day = new Date(d1); // 30.01.2017
current_day.setDate(d1.getDate() + ProHistoryCtrl.weekPrevious + 6); // 30-12+5=23
console.log("currentdayprevious" + ProHistoryCtrl.weekPrevious); //-6,-12,-18,-24
var previousWeekUTCTimestamp = Math.floor(previousWeek.getTime() / 1000);
var currentUTC = Math.floor(current_day.getTime() / 1000);
console.log("previousWeekUTCTimestamp" + previousWeekUTCTimestamp);
console.log("currentUTC" + currentUTC);
var sinceUTC = previousWeekUTCTimestamp;
var untilUTC = currentUTC;
}
Its first time comes correct 24-march 2017 to 30 march 2017 , next previous its comes 24-march to 18march2017
Any ideas ?please
The problem seems to be with your Maths, you get the previous week by subtracting 6 for each week and then subtracting an extra 1. This is fine for the first week where -6 -1 = -7, however for the second week this is (-6 * 2) - 1 = -13 but two weeks should be -14. The code that is incorrect is:
ProHistoryCtrl.weekPrevious = (-6 * ProHistoryCtrl.weekPrevcount);
d1.setDate(d2.getDate() - 1);
A solution would therefore be:
function getPreviousWeek(){
ProHistoryCtrl.weekPrevcount = ProHistoryCtrl.weekPrevcount + 1;
ProHistoryCtrl.weekPrevious = (-7 * ProHistoryCtrl.weekPrevcount);
getByWeek();
}
function getNextWeek(){
ProHistoryCtrl.weekPrevcount = ProHistoryCtrl.weekPrevcount - 1;
ProHistoryCtrl.weekPrevious = (-7 * ProHistoryCtrl.weekPrevcount);
getByWeek();
}
function getByWeek(){
var d2 = new Date(); // 31.01.2017
var d1 = new Date(d2);
d1.setDate(d2.getDate()); // 30.01.2017
var previousWeek = '';
var current_day = '';
previousWeek = new Date(d1);
previousWeek.setDate(d1.getDate() + ProHistoryCtrl.weekPrevious); // 30-13=17
current_day = new Date(d1); // 30.01.2017
current_day.setDate(d1.getDate() + ProHistoryCtrl.weekPrevious + 6); // 30-12+5=23
var previousWeekUTCTimestamp = Math.floor(previousWeek.getTime() / 1000);
var currentUTC = Math.floor(current_day.getTime() / 1000);
var sinceUTC = previousWeekUTCTimestamp;
var untilUTC = currentUTC;
}
Use this function. You don't need extra functions
var btn = document.querySelector("button")
Date.prototype.addDays = function(days) {
this.setDate(this.getDate() + parseInt(days));
return this;
};
function getDate(days) {
var date = new Date().addDays(days);
return date
}
btn.addEventListener("click", function() {
var pastSevenDays = getDate(-7)
var nextSevenDays = getDate(7)
// only date
console.log(pastSevenDays.toLocaleString().slice(0,10))
console.log(nextSevenDays.toLocaleString().slice(0,10))
}, false)
<button>Get Dates</button>

How can I generate dates of a certain Gregorian year to Hijri

I want to make an auto adaptation or generation of days of year, from Gregorian to Hijri.
I mean that you want to select or write the year as example:
select 2015:
Get all the days of 2015 in Gregorian and then its convert to Hijrim and present the list of hijri.
so you want to return to 2 list list1 gregoriad days list vs another list2 hijhri
I want this in JavaScript and using kendo-ui framework to view it.
Kendo UI only supports the Gregorian calendar. There don't seem to be plans to add any others.
You could use .NET to convert the date.
public string ConvertDateCalendar(DateTime DateConv, ECalenderTypes calendar, string DateLangCulture)
{
System.Globalization.DateTimeFormatInfo DTFormat;
DateLangCulture = DateLangCulture.ToLower();
/// We can't have the hijri date writen in English. We will get a runtime error
if (calendar == ECalenderTypes.Hijri && DateLangCulture.StartsWith("en-"))
{
DateLangCulture = "ar-sa";
}
/// Set the date time format to the given culture
DTFormat = new System.Globalization.CultureInfo(DateLangCulture, false).DateTimeFormat;
/// Set the calendar property of the date time format to the given calendar
switch (calendar)
{
case ECalenderTypes.Hijri:
DTFormat.Calendar = new System.Globalization.HijriCalendar();
break;
case ECalenderTypes.Gregorian:
DTFormat.Calendar = new System.Globalization.GregorianCalendar();
break;
default:
return "";
}
/// We format the date structure to whatever we want
DTFormat.ShortDatePattern = "dd/MM/yyyy";
return (DateConv.Date.ToString("f", DTFormat));
}
And then:
ConvertDateCalendar("01/01/2015", ECalenderTypes.Gregorian, "en-US");
ConvertDateCalendar("01/01/2015", ECalenderTypes.Hijri, "en-US");
JavaScript
function gmod(n,m){
return ((n%m)+m)%m;
}
function getDate(adjust){
var today = new Date();
if(adjust) {
adjustmili = 1000*60*60*24 * adjust;
todaymili = today.getTime() + adjustmili;
today = new Date(todaymili);
}
day = today.getDate();
month = today.getMonth();
year = today.getFullYear();
m = month+1;
y = year;
if(m<3) {
y -= 1;
m += 12;
}
a = Math.floor(y/100.);
b = 2-a+Math.floor(a/4.);
if(y<1583) b = 0;
if(y==1582) {
if(m>10) b = -10;
if(m==10) {
b = 0;
if(day>4) b = -10;
}
}
jd = Math.floor(365.25*(y+4716))+Math.floor(30.6001*(m+1))+day+b-1524;
b = 0;
if(jd>2299160){
a = Math.floor((jd-1867216.25)/36524.25);
b = 1+a-Math.floor(a/4.);
}
bb = jd+b+1524;
cc = Math.floor((bb-122.1)/365.25);
dd = Math.floor(365.25*cc);
ee = Math.floor((bb-dd)/30.6001);
day =(bb-dd)-Math.floor(30.6001*ee);
month = ee-1;
if(ee>13) {
cc += 1;
month = ee-13;
}
year = cc-4716;
wd = gmod(jd+1,7)+1;
iyear = 10631./30.;
epochastro = 1948084;
epochcivil = 1948085;
shift1 = 8.01/60.;
z = jd-epochastro;
cyc = Math.floor(z/10631.);
z = z-10631*cyc;
j = Math.floor((z-shift1)/iyear);
iy = 30*cyc+j;
z = z-Math.floor(j*iyear+shift1);
im = Math.floor((z+28.5001)/29.5);
if(im==13) im = 12;
id = z-Math.floor(29.5001*im-29);
var myRes = new Array(8);
myRes[0] = day; //calculated day (CE)
myRes[1] = month-1; //calculated month (CE)
myRes[2] = year; //calculated year (CE)
myRes[3] = jd-1; //julian day number
myRes[4] = wd-1; //weekday number
myRes[5] = id; //islamic date
myRes[6] = im-1; //islamic month
myRes[7] = iy; //islamic year
return myRes;
}
function writeHijriDate(adjustment) {
var wdNames = new Array("Ahad","Ithnin","Thulatha","Arbaa","Khams","Jumuah","Sabt");
var iMonthNames = new Array("Muharram","Safar","Rabi'ul Awwal","Rabi'ul Akhir", "Jumadal Ula","Jumadal Akhira","Rajab","Sha'ban", "Ramadan","Shawwal","Dhul Qa'ada","Dhul Hijja");
var iDate = getDate(adjustment);
var outputHijriDate = wdNames[iDate[4]] + ", " + iDate[5] + " " + iMonthNames[iDate[6]] + " " + iDate[7] + " AH";
return outputHijriDate;
}
Usage (converts current date):
writeHijriDate(1);
Hirji calendar is not supported with Kendo UI.
Thanks all
I found someone write a simple implementation for the Islamic calender(Hijri) in Javascript
http://xsoh.github.com/Hijri.js
its consist the convert from hijri to gregorian and Vice versaز
The conversion is very easy using Intl object (read more), as following:
a = new Date();
localeFormat= 'ar-SA-islamic-umalqura';
Intl.DateTimeFormat(localeFormat).format(a)

javascript calculate days lived from birthday

Im trying to make a script which calculate the days you live. My idea is the user to select their birthday by clicking buttons. I read some scripts and wrote some questions and finally a good guy sent me this code, but it isn working for me.. JSFIDDLE
function IncrementDay(month,year)
{
var lastDay = new Date(year, month, 0).getDate();
var nDay=document.getElementById("bday").value;
++nDay;
if (nDay > lastDay) {
nDay =1;
}
document.getElementById("bday").value=nDay;
}
function IncrementMonth(from_IncrementDay = false)
{
var nMonth = document.getElementById("bmonth").value;
++nMonth;
if (nMonth==13) {
nMonth =1;
}
document.getElementById("bmonth").value=nMonth;
}
function isValidDate(s) {
var bits = s.split('/');
var y = bits[0], m = bits[1], d = bits[2];
// Assume not leap year by default (note zero index for Jan)
var daysInMonth = [31,28,31,30,31,30,31,31,30,31,30,31];
// If evenly divisible by 4 and not evenly divisible by 100,
// or is evenly divisible by 400, then a leap year
if ( (!(y % 4) && y % 100) || !(y % 400)) {
daysInMonth[1] = 29;
}
return d <= daysInMonth[--m]
}
function days_between(date1, date2) {
// The number of milliseconds in one day
var ONE_DAY = 1000 * 60 * 60 * 24
// Convert both dates to milliseconds
var date1_ms = date1.getTime()
var date2_ms = date2.getTime()
// Calculate the difference in milliseconds
var difference_ms = Math.abs(date1_ms - date2_ms)
// Convert back to days and return
return Math.round(difference_ms/ONE_DAY)
}
function calculate() {
var _bd = document.getElementById('byear').value + "/" + document.getElementById('bmonth').value + "/" + document.getElementById('bday').value;
if (!isValidDate(_bd)) return;
var _days = days_between(new Date(), new Date(_bd));
document.getElementById("days").innerHTML = _days;
}
var cDate= new Date();
var cDay = cDate.getDate();
var cMonth = cDate.getMonth();
var cYear = cDate.getFullYear();
var days_gone = 0;
++cMonth;
document.getElementById("bday").value=cDay;
document.getElementById("bmonth").value=cMonth;
document.getElementById("byear").value=cYear;
Im not very familiar with javascript, can you tell me where's the mistake? thanks.
var oneDay = 24*60*60*1000; // hours*minutes*seconds*milliseconds
var firstDate = new Date(2008,01,12);
var secondDate = new Date();
var diffDays = Math.round(Math.abs((firstDate.getTime() - secondDate.getTime())/(oneDay)));
I like the moment js library for this.
http://momentjs.com/
This is how you would do it with moment.js
var today = moment();
var birthDate = moment([2000, 12, 31]); // 2000 (year), 12 (month), 31 (day)
var daysDiff = today.diff(birthDate, 'days'); //4823
if you want the difference in years
var yearsDiff = today.diff(birthDate, 'years'); //13

javascript age calculator keep giving wrong numbers,

i am trying to do a javascript program and calculate the age for the use, i have done the code below,
function submitForm() {
var d = new Date();
var year = d.getFullYear();
var month = d.getMonth();
var days = d.getDay();
var minutes = d.getMinutes();
var hours = d.getHours();
var byear = document.dataform.year.selectedIndex;
var bmonth = document.dataform.month.selectedIndex;
var bday = document.dataform.day.selectedIndex;
var bhours = bday * 24;
var bmin = 60 * b hours;
var dyears = year - byear;
var dmonth = month - bmonth;
var ddays = (days - bday);
var dhours = hours - bhours;
var dminutes = minutes - bmin;
var daysTillBDay = 365 - bday;
if (isLeapYear() == true) {
dyears = year - byear;
dmonth = month - bmonth;
ddays = (days - bday) + 1;
dhours = hours - bhours;
dminutes = minutes - bmin;
daysTillBDay = 365 - bday;
}
var el = document.getElementsByName('uyears');
el[0].value = dyears + " years old.";
el = document.getElementsByName('umonths');
el[0].value = dmonth + " months old.";
document.getElementsByName('udays')[0].value = ddays;
document.getElementsByName('lmonths')[0].value = dmonth;
document.getElementsByName('ldays')[0].value = ddays;
document.getElementsByName('lhrs')[0].value = dhours;
document.getElementsByName('lmin')[0].value = dminutes;
document.getElementsByName('bdays')[0].value = daysTillBDay + " days left till your birthday.";
}
I think i will be work before i try to run the program, after i run the program, i found that the program give me almost everthing wrong, i have the year like 2013(newest yrs.), and the month i will equal the negativetive number such as -1 if i enter 11. I just try to find users age, which i believe is the date of today(today's gate)-(the birthday date), but is not workng now, anyobne know what>?
The problem is very simple (and one mistake that I've made myself) - new Date().getDay() returns the day in the week (0 for Monday, through to 6 for Sunday), not the day in the month.
The function that you're looking for is new Date().getDate(), which returns 1 for January the 1st, 25 on Christmas Day, and so on.

How to calculate date difference in JavaScript? [duplicate]

This question already has answers here:
How to calculate number of days between two dates?
(42 answers)
Closed 3 months ago.
I want to calculate date difference in days, hours, minutes, seconds, milliseconds, nanoseconds. How can I do it?
Assuming you have two Date objects, you can just subtract them to get the difference in milliseconds:
var difference = date2 - date1;
From there, you can use simple arithmetic to derive the other values.
var DateDiff = {
inDays: function(d1, d2) {
var t2 = d2.getTime();
var t1 = d1.getTime();
return Math.floor((t2-t1)/(24*3600*1000));
},
inWeeks: function(d1, d2) {
var t2 = d2.getTime();
var t1 = d1.getTime();
return parseInt((t2-t1)/(24*3600*1000*7));
},
inMonths: function(d1, d2) {
var d1Y = d1.getFullYear();
var d2Y = d2.getFullYear();
var d1M = d1.getMonth();
var d2M = d2.getMonth();
return (d2M+12*d2Y)-(d1M+12*d1Y);
},
inYears: function(d1, d2) {
return d2.getFullYear()-d1.getFullYear();
}
}
var dString = "May, 20, 1984";
var d1 = new Date(dString);
var d2 = new Date();
document.write("<br />Number of <b>days</b> since "+dString+": "+DateDiff.inDays(d1, d2));
document.write("<br />Number of <b>weeks</b> since "+dString+": "+DateDiff.inWeeks(d1, d2));
document.write("<br />Number of <b>months</b> since "+dString+": "+DateDiff.inMonths(d1, d2));
document.write("<br />Number of <b>years</b> since "+dString+": "+DateDiff.inYears(d1, d2));
Code sample taken from here.
Another solution is convert difference to a new Date object and get that date's year(diff from 1970), month, day etc.
var date1 = new Date(2010, 6, 17);
var date2 = new Date(2013, 12, 18);
var diff = new Date(date2.getTime() - date1.getTime());
// diff is: Thu Jul 05 1973 04:00:00 GMT+0300 (EEST)
console.log(diff.getUTCFullYear() - 1970); // Gives difference as year
// 3
console.log(diff.getUTCMonth()); // Gives month count of difference
// 6
console.log(diff.getUTCDate() - 1); // Gives day count of difference
// 4
So difference is like "3 years and 6 months and 4 days". If you want to take difference in a human readable style, that can help you.
Expressions like "difference in days" are never as simple as they seem. If you have the following dates:
d1: 2011-10-15 23:59:00
d1: 2011-10-16 00:01:00
the difference in time is 2 minutes, should the "difference in days" be 1 or 0? Similar issues arise for any expression of the difference in months, years or whatever since years, months and days are of different lengths and different times (e.g. the day that daylight saving starts is 1 hour shorter than usual and two hours shorter than the day that it ends).
Here is a function for a difference in days that ignores the time, i.e. for the above dates it returns 1.
/*
Get the number of days between two dates - not inclusive.
"between" does not include the start date, so days
between Thursday and Friday is one, Thursday to Saturday
is two, and so on. Between Friday and the following Friday is 7.
e.g. getDaysBetweenDates( 22-Jul-2011, 29-jul-2011) => 7.
If want inclusive dates (e.g. leave from 1/1/2011 to 30/1/2011),
use date prior to start date (i.e. 31/12/2010 to 30/1/2011).
Only calculates whole days.
Assumes d0 <= d1
*/
function getDaysBetweenDates(d0, d1) {
var msPerDay = 8.64e7;
// Copy dates so don't mess them up
var x0 = new Date(d0);
var x1 = new Date(d1);
// Set to noon - avoid DST errors
x0.setHours(12,0,0);
x1.setHours(12,0,0);
// Round to remove daylight saving errors
return Math.round( (x1 - x0) / msPerDay );
}
This can be more concise:
/* Return number of days between d0 and d1.
** Returns positive if d0 < d1, otherwise negative.
**
** e.g. between 2000-02-28 and 2001-02-28 there are 366 days
** between 2015-12-28 and 2015-12-29 there is 1 day
** between 2015-12-28 23:59:59 and 2015-12-29 00:00:01 there is 1 day
** between 2015-12-28 00:00:01 and 2015-12-28 23:59:59 there are 0 days
**
** #param {Date} d0 - start date
** #param {Date} d1 - end date
** #returns {number} - whole number of days between d0 and d1
**
*/
function daysDifference(d0, d1) {
var diff = new Date(+d1).setHours(12) - new Date(+d0).setHours(12);
return Math.round(diff/8.64e7);
}
// Simple formatter
function formatDate(date){
return [date.getFullYear(),('0'+(date.getMonth()+1)).slice(-2),('0'+date.getDate()).slice(-2)].join('-');
}
// Examples
[[new Date(2000,1,28), new Date(2001,1,28)], // Leap year
[new Date(2001,1,28), new Date(2002,1,28)], // Not leap year
[new Date(2017,0,1), new Date(2017,1,1)]
].forEach(function(dates) {
document.write('From ' + formatDate(dates[0]) + ' to ' + formatDate(dates[1]) +
' is ' + daysDifference(dates[0],dates[1]) + ' days<br>');
});
<html lang="en">
<head>
<script>
function getDateDiff(time1, time2) {
var str1= time1.split('/');
var str2= time2.split('/');
// yyyy , mm , dd
var t1 = new Date(str1[2], str1[0]-1, str1[1]);
var t2 = new Date(str2[2], str2[0]-1, str2[1]);
var diffMS = t1 - t2;
console.log(diffMS + ' ms');
var diffS = diffMS / 1000;
console.log(diffS + ' ');
var diffM = diffS / 60;
console.log(diffM + ' minutes');
var diffH = diffM / 60;
console.log(diffH + ' hours');
var diffD = diffH / 24;
console.log(diffD + ' days');
alert(diffD);
}
//alert(getDateDiff('10/18/2013','10/14/2013'));
</script>
</head>
<body>
<input type="button"
onclick="getDateDiff('10/18/2013','10/14/2013')"
value="clickHere()" />
</body>
</html>
use Moment.js for all your JavaScript related date-time calculation
Answer to your question is:
var a = moment([2007, 0, 29]);
var b = moment([2007, 0, 28]);
a.diff(b) // 86400000
Complete details can be found here
adding to #paresh mayani 's answer, to work like Facebook - showing how much time has passed in sec/min/hours/weeks/months/years
var DateDiff = {
inSeconds: function(d1, d2) {
var t2 = d2.getTime();
var t1 = d1.getTime();
return parseInt((t2-t1)/1000);
},
inMinutes: function(d1, d2) {
var t2 = d2.getTime();
var t1 = d1.getTime();
return parseInt((t2-t1)/60000);
},
inHours: function(d1, d2) {
var t2 = d2.getTime();
var t1 = d1.getTime();
return parseInt((t2-t1)/3600000);
},
inDays: function(d1, d2) {
var t2 = d2.getTime();
var t1 = d1.getTime();
return parseInt((t2-t1)/(24*3600*1000));
},
inWeeks: function(d1, d2) {
var t2 = d2.getTime();
var t1 = d1.getTime();
return parseInt((t2-t1)/(24*3600*1000*7));
},
inMonths: function(d1, d2) {
var d1Y = d1.getFullYear();
var d2Y = d2.getFullYear();
var d1M = d1.getMonth();
var d2M = d2.getMonth();
return (d2M+12*d2Y)-(d1M+12*d1Y);
},
inYears: function(d1, d2) {
return d2.getFullYear()-d1.getFullYear();
}
}
var dString = "May, 20, 1984"; //will also get (Y-m-d H:i:s)
var d1 = new Date(dString);
var d2 = new Date();
var timeLaps = DateDiff.inSeconds(d1, d2);
var dateOutput = "";
if (timeLaps<60)
{
dateOutput = timeLaps+" seconds";
}
else
{
timeLaps = DateDiff.inMinutes(d1, d2);
if (timeLaps<60)
{
dateOutput = timeLaps+" minutes";
}
else
{
timeLaps = DateDiff.inHours(d1, d2);
if (timeLaps<24)
{
dateOutput = timeLaps+" hours";
}
else
{
timeLaps = DateDiff.inDays(d1, d2);
if (timeLaps<7)
{
dateOutput = timeLaps+" days";
}
else
{
timeLaps = DateDiff.inWeeks(d1, d2);
if (timeLaps<4)
{
dateOutput = timeLaps+" weeks";
}
else
{
timeLaps = DateDiff.inMonths(d1, d2);
if (timeLaps<12)
{
dateOutput = timeLaps+" months";
}
else
{
timeLaps = DateDiff.inYears(d1, d2);
dateOutput = timeLaps+" years";
}
}
}
}
}
}
alert (dateOutput);
With momentjs it's simple:
moment("2016-04-08").fromNow();
function DateDiff(date1, date2) {
date1.setHours(0);
date1.setMinutes(0, 0, 0);
date2.setHours(0);
date2.setMinutes(0, 0, 0);
var datediff = Math.abs(date1.getTime() - date2.getTime()); // difference
return parseInt(datediff / (24 * 60 * 60 * 1000), 10); //Convert values days and return value
}
var d1=new Date(2011,0,1); // jan,1 2011
var d2=new Date(); // now
var diff=d2-d1,sign=diff<0?-1:1,milliseconds,seconds,minutes,hours,days;
diff/=sign; // or diff=Math.abs(diff);
diff=(diff-(milliseconds=diff%1000))/1000;
diff=(diff-(seconds=diff%60))/60;
diff=(diff-(minutes=diff%60))/60;
days=(diff-(hours=diff%24))/24;
console.info(sign===1?"Elapsed: ":"Remains: ",
days+" days, ",
hours+" hours, ",
minutes+" minutes, ",
seconds+" seconds, ",
milliseconds+" milliseconds.");
I think this should do it.
let today = new Date();
let form_date=new Date('2019-10-23')
let difference=form_date>today ? form_date-today : today-form_date
let diff_days=Math.floor(difference/(1000*3600*24))
based on javascript runtime prototype implementation you can use simple arithmetic to subtract dates as in bellow
var sep = new Date(2020, 07, 31, 23, 59, 59);
var today = new Date();
var diffD = Math.floor((sep - today) / (1000 * 60 * 60 * 24));
console.log('Day Diff: '+diffD);
the difference return answer as milliseconds, then you have to convert it by division:
by 1000 to convert to second
by 1000×60 convert to minute
by 1000×60×60 convert to hour
by 1000×60×60×24 convert to day
function DateDiff(b, e)
{
let
endYear = e.getFullYear(),
endMonth = e.getMonth(),
years = endYear - b.getFullYear(),
months = endMonth - b.getMonth(),
days = e.getDate() - b.getDate();
if (months < 0)
{
years--;
months += 12;
}
if (days < 0)
{
months--;
days += new Date(endYear, endMonth, 0).getDate();
}
return [years, months, days];
}
[years, months, days] = DateDiff(
new Date("October 21, 1980"),
new Date("July 11, 2017")); // 36 8 20
Sorry but flat millisecond calculation is not reliable
Thanks for all the responses, but few of the functions I tried are failing either on
1. A date near today's date
2. A date in 1970 or
3. A date in a leap year.
Approach that best worked for me and covers all scenario e.g. leap year, near date in 1970, feb 29 etc.
var someday = new Date("8/1/1985");
var today = new Date();
var years = today.getFullYear() - someday.getFullYear();
// Reset someday to the current year.
someday.setFullYear(today.getFullYear());
// Depending on when that day falls for this year, subtract 1.
if (today < someday)
{
years--;
}
document.write("Its been " + years + " full years.");
This code will return the difference between two dates in days:
const previous_date = new Date("2019-12-23");
const current_date = new Date();
const current_year = current_date.getFullYear();
const previous_date_year =
previous_date.getFullYear();
const difference_in_years = current_year -
previous_date_year;
let months = current_date.getMonth();
months = months + 1; // for making the indexing
// of months from 1
for(let i = 0; i < difference_in_years; i++){
months = months + 12;
}
let days = current_date.getDate();
days = days + (months * 30.417);
console.log(`The days between ${current_date} and
${previous_date} are : ${days} (approximately)`);
If you are using moment.js then it is pretty simple to find date difference.
var now = "04/09/2013 15:00:00";
var then = "04/09/2013 14:20:30";
moment.utc(moment(now,"DD/MM/YYYY HH:mm:ss").diff(moment(then,"DD/MM/YYYY HH:mm:ss"))).format("HH:mm:ss")
This is how you can implement difference between dates without a framework.
function getDateDiff(dateOne, dateTwo) {
if(dateOne.charAt(2)=='-' & dateTwo.charAt(2)=='-'){
dateOne = new Date(formatDate(dateOne));
dateTwo = new Date(formatDate(dateTwo));
}
else{
dateOne = new Date(dateOne);
dateTwo = new Date(dateTwo);
}
let timeDiff = Math.abs(dateOne.getTime() - dateTwo.getTime());
let diffDays = Math.ceil(timeDiff / (1000 * 3600 * 24));
let diffMonths = Math.ceil(diffDays/31);
let diffYears = Math.ceil(diffMonths/12);
let message = "Difference in Days: " + diffDays + " " +
"Difference in Months: " + diffMonths+ " " +
"Difference in Years: " + diffYears;
return message;
}
function formatDate(date) {
return date.split('-').reverse().join('-');
}
console.log(getDateDiff("23-04-2017", "23-04-2018"));
function daysInMonth (month, year) {
return new Date(year, month, 0).getDate();
}
function getduration(){
let A= document.getElementById("date1_id").value
let B= document.getElementById("date2_id").value
let C=Number(A.substring(3,5))
let D=Number(B.substring(3,5))
let dif=D-C
let arr=[];
let sum=0;
for (let i=0;i<dif+1;i++){
sum+=Number(daysInMonth(i+C,2019))
}
let sum_alter=0;
for (let i=0;i<dif;i++){
sum_alter+=Number(daysInMonth(i+C,2019))
}
let no_of_month=(Number(B.substring(3,5)) - Number(A.substring(3,5)))
let days=[];
if ((Number(B.substring(3,5)) - Number(A.substring(3,5)))>0||Number(B.substring(0,2)) - Number(A.substring(0,2))<0){
days=Number(B.substring(0,2)) - Number(A.substring(0,2)) + sum_alter
}
if ((Number(B.substring(3,5)) == Number(A.substring(3,5)))){
console.log(Number(B.substring(0,2)) - Number(A.substring(0,2)) + sum_alter)
}
time_1=[]; time_2=[]; let hour=[];
time_1=document.getElementById("time1_id").value
time_2=document.getElementById("time2_id").value
if (time_1.substring(0,2)=="12"){
time_1="00:00:00 PM"
}
if (time_1.substring(9,11)==time_2.substring(9,11)){
hour=Math.abs(Number(time_2.substring(0,2)) - Number(time_1.substring(0,2)))
}
if (time_1.substring(9,11)!=time_2.substring(9,11)){
hour=Math.abs(Number(time_2.substring(0,2)) - Number(time_1.substring(0,2)))+12
}
let min=Math.abs(Number(time_1.substring(3,5))-Number(time_2.substring(3,5)))
document.getElementById("duration_id").value=days +" days "+ hour+" hour " + min+" min "
}
<input type="text" id="date1_id" placeholder="28/05/2019">
<input type="text" id="date2_id" placeholder="29/06/2019">
<br><br>
<input type="text" id="time1_id" placeholder="08:01:00 AM">
<input type="text" id="time2_id" placeholder="00:00:00 PM">
<br><br>
<button class="text" onClick="getduration()">Submit </button>
<br><br>
<input type="text" id="duration_id" placeholder="days hour min">
var date1 = new Date("06/30/2019");
var date2 = new Date("07/30/2019");
// To calculate the time difference of two dates
var Difference_In_Time = date2.getTime() - date1.getTime();
// To calculate the no. of days between two dates
var Difference_In_Days = Difference_In_Time / (1000 * 3600 * 24);
//To display the final no. of days (result)
document.write("Total number of days between dates <br>"
+ date1 + "<br> and <br>"
+ date2 + " is: <br> "
+ Difference_In_Days);
this should work just fine if you just need to show what time left, since JavaScript uses frames for its time you'll have get your End Time - The Time RN after that we can divide it by 1000 since apparently 1000 frames = 1 seconds, after that you can use the basic math of time, but there's still a problem to this code, since the calculation is static, it can't compensate for the different day total in a year (360/365/366), the bunch of IF after the calculation is to make it null if the time is lower than 0, hope this helps even though it's not exactly what you're asking :)
var now = new Date();
var end = new Date("End Time");
var total = (end - now) ;
var totalD = Math.abs(Math.floor(total/1000));
var years = Math.floor(totalD / (365*60*60*24));
var months = Math.floor((totalD - years*365*60*60*24) / (30*60*60*24));
var days = Math.floor((totalD - years*365*60*60*24 - months*30*60*60*24)/ (60*60*24));
var hours = Math.floor((totalD - years*365*60*60*24 - months*30*60*60*24 - days*60*60*24)/ (60*60));
var minutes = Math.floor((totalD - years*365*60*60*24 - months*30*60*60*24 - days*60*60*24 - hours*60*60)/ (60));
var seconds = Math.floor(totalD - years*365*60*60*24 - months*30*60*60*24 - days*60*60*24 - hours*60*60 - minutes*60);
var Y = years < 1 ? "" : years + " Years ";
var M = months < 1 ? "" : months + " Months ";
var D = days < 1 ? "" : days + " Days ";
var H = hours < 1 ? "" : hours + " Hours ";
var I = minutes < 1 ? "" : minutes + " Minutes ";
var S = seconds < 1 ? "" : seconds + " Seconds ";
var A = years == 0 && months == 0 && days == 0 && hours == 0 && minutes == 0 && seconds == 0 ? "Sending" : " Remaining";
document.getElementById('txt').innerHTML = Y + M + D + H + I + S + A;
Ok, there are a bunch of ways you can do that.
Yes, you can use plain old JS. Just try:
let dt1 = new Date()
let dt2 = new Date()
Let's emulate passage using Date.prototype.setMinutes and make sure we are in range.
dt1.setMinutes(7)
dt2.setMinutes(42)
console.log('Elapsed seconds:',(dt2-dt1)/1000)
Alternatively you could use some library like js-joda, where you can easily do things like this (directly from docs):
var dt1 = LocalDateTime.parse("2016-02-26T23:55:42.123");
var dt2 = dt1
.plusYears(6)
.plusMonths(12)
.plusHours(2)
.plusMinutes(42)
.plusSeconds(12);
// obtain the duration between the two dates
dt1.until(dt2, ChronoUnit.YEARS); // 7
dt1.until(dt2, ChronoUnit.MONTHS); // 84
dt1.until(dt2, ChronoUnit.WEEKS); // 356
dt1.until(dt2, ChronoUnit.DAYS); // 2557
dt1.until(dt2, ChronoUnit.HOURS); // 61370
dt1.until(dt2, ChronoUnit.MINUTES); // 3682242
dt1.until(dt2, ChronoUnit.SECONDS); // 220934532
There are plenty more libraries ofc, but js-joda has an added bonus of being available also in Java, where it has been extensively tested. All those tests have been migrated to js-joda, it's also immutable.
I made a below function to get the difference between now and "2021-02-26T21:50:42.123".
The difference return answer as milliseconds, so I convert it by using this formula:
(1000 * 3600 * 24).
function getDiff(dateAcquired) {
let calDiff = Math.floor(
(new Date() - new Date(dateAcquired)) / (1000 * 3600 * 24)
);
return calDiff;
}
console.log(getDiff("2021-02-26T21:50:42.123"));
Can be useful :
const date_diff = (date1, date2) => Math.ceil(Math.abs(date1 - date2)/24 * 60 * 60 * 1000)
or
const date_diff = (date1, date2) => Math.ceil(Math.abs(date1 - date2)/86400000)
where 24 * 60 * 60 * 1000 is (day * minutes * seconds * milliseconds) = 86400000 milliseconds in one day
Thank you
// the idea is to get time left for new year.
// Not considering milliseconds as of now, but that
// can be done
var newYear = '1 Jan 2023';
const secondsInAMin = 60;
const secondsInAnHour = 60 * secondsInAMin;
const secondsInADay = 24 * secondsInAnHour;
function DateDiffJs() {
var newYearDate = new Date(newYear);
var currDate = new Date();
var remainingSecondsInDateDiff = (newYearDate - currDate) / 1000;
var days = Math.floor(remainingSecondsInDateDiff / secondsInADay);
var remainingSecondsAfterDays = remainingSecondsInDateDiff - (days * secondsInADay);
var hours = Math.floor(remainingSecondsAfterDays / secondsInAnHour);
var remainingSecondsAfterhours = remainingSecondsAfterDays - (hours * secondsInAnHour);
var mins = Math.floor(remainingSecondsAfterhours / secondsInAMin);
var seconds = Math.floor(remainingSecondsAfterhours - (mins * secondsInAMin));
console.log(`days :: ${days}`)
console.log(`hours :: ${hours}`)
console.log(`mins :: ${mins}`)
console.log(`seconds :: ${seconds}`)
}
DateDiffJs();

Categories

Resources