Как сделать точный расчёт прошедших дней, месяцев, лет?

На пример расчёт как на этом сайте.
Есть ли какой-то фреймворк/библиотека под такие нужды?
Чтобы учитывался високосный год, количество дней в месяцах и т.д.
  • Вопрос задан
  • 158 просмотров
Решения вопроса 2
DevMan
@DevMan
любой язык умеет работать с датами.
фреймворки не нужны, максимум – врапер/либа для удобной работы.
для совета нужно знать под какой ЯП советовать.
Ответ написан
yarkov
@yarkov Куратор тега JavaScript
Помог ответ? Отметь решением.
Пригласить эксперта
Ответы на вопрос 1
JaxAdam
@JaxAdam
Junior Full-Stack Developer
Конкретно на вашем сайте это реализовано через JS. Вот скрипт:
function Dialogv5d6e4ddf862d1() {var me = this;me.id = "dialogv5d6e4ddf862d1";me.GetElement = function () { return document.getElementById( me.id ); };me.GetEventHandlerName = function () { return "dialoghandlerv5d6e4ddf862d1"; };this.dialog_controls = [new DialogInput("date1", this, 0,new ElementAccessorDate(5)),new DialogInput("date2", this, 0,new ElementAccessorDate(5)),new DialogInput("calculate", this, 0,new ElementAccessorOperation()),new DialogInput("_progress_", this, 0,new ElementAccessorDefault()),new DialogInput("days", this, 0,new ElementAccessorOutput()),new DialogInput("YMD", this, 0,new ElementAccessorOutput())];me.dialog_controls._all ={};me.dialog_controls.forEach( function( e ) { if (me[e.id]===undefined) me[e.id] = e; me.dialog_controls._all[e.id] = e;} );this.addHandler = function ( handler ) {this.dialog_controls.forEach(function(c) { c.addHandler( handler);});};this.SetValues = function ( values ) {this.dialog_controls.forEach(function(c) {if ( values[c.id]!==undefined ) { c.SetValue( values[c.id] ); }});};this.Clear = function ( ) {this.dialog_controls.forEach(function( c) { c.ResetValue();});};this.SetDefaultValues = function () { this.Clear();};this.GetValues = function () {var ret = {}; this.dialog_controls.forEach(function( c) { ret[c.id] = c.GetValue();});return ret;};this.Validate = function ( ) {for(var i=0;i<me.dialog_controls.length;++i) if (!me.dialog_controls[i].Validate()) return false; return true;};this.layout = function ( ) {}};document.addEventListener("DOMContentLoaded", function(event) {var dlg = new Dialogv5d6e4ddf862d1();
var hd = new CalculatorHandler(new function () {
var me = this;
me.id = 273;
me.global = 1;
var outputs = {};
me.sinks={change:[],done:[]};
me.startOnLoad = 1;
me.infinite = 0;
var inputs = {};
var renderers = {};
var recordsets = {};
var diagrams = {};
var handler, dialog, refreshTimer;
var worker; var proxies; var stubs;
var outer = this;
var Planetcalc = new function() { 
var inner = this; var cpcData = new CalcProgressData();var Calculate273_cpc = new CalcProgressControl(cpcData);inner.Calculate273 = function( ___inp___ ) {
var progressControl = Calculate273_cpc;
var Calculate273_result={};function  __impl__( __inp__ ) {

var date1 = __inp__["date1"]===undefined?"2001-01-01 00:00:00":__inp__["date1"];
var date2 = __inp__["date2"]===undefined?"":__inp__["date2"];
var days = { "SetValue": function( v ) { Calculate273_result["days"]=v; } };
var YMD = { "SetValue": function( v ) { Calculate273_result["YMD"]=v; } };var t1 = date1.getTime();
var t2 = date2.getTime();
var ms = ( t1>t2 )?t1-t2:t2-t1;
days.SetValue( Math.round( ms/86400000) );

var d1 = t1>t2?date1:date2;
var d2 = t1>t2?date2:date1;
var y = d1.getFullYear()-d2.getFullYear();
var m = d1.getMonth()-d2.getMonth();
var d = d1.getDate()-d2.getDate();

if ( d<0 ) {
	var dpm = d1.getMonth();
	var dpy = d1.getFullYear();
	while( d<0) {
		var dpd = 31;
		m-=1;
		if ( dpm ) {
			dpm -=1;
		} else {
			dpy-=1
			dpm=11;
		}
		var dp = new Date( dpy,dpm,31);
		if ( dpm!=dp.getMonth() ) {
			dpd-=dp.getDate();
		}
		d+=dpd;
	}
} 

if ( m<0 ) {
	y-=1;
	m = 12+m;
}
YMD.SetValue( y + ', ' + m + ', ' + d );
};
 __impl__(___inp___); if ( progressControl.completed() ) { progressControl.context = null; } return Calculate273_result;};inner.main=inner.Calculate273;inner.progressControl = Calculate273_cpc; inner.init = function(){inner.progressControl.onDataReady();};};me.adapter = { encoder:{"date1":Date2String,"date2":Date2String},decoder:{"date1":String2Date,"date2":String2Date}};function startLoad() {
me.progressControl.addEventListener("ready",handler.onReady);
Planetcalc.init(); }
me.timeout = 1500;
me.auto = 1;
me.init = function ( h, dlg ) { var o; handler=h;dialog =dlg;me.progressControl = Planetcalc.progressControl;var n; var fn;n='date1';if ( dlg[n] ) { inputs[n] = dlg[n]; }n='date2';if ( dlg[n] ) { inputs[n] = dlg[n]; }o = dlg.days; outputs[o.id] =o; o.formatter =new FormatterNumber( 0,0,0,"R" );o = dlg.YMD; outputs[o.id] =o; o.formatter =new FormatterSame( );startLoad();};
me.stop = function() {
	if (worker) worker.postMessage({type:"stop"}); 
	else Planetcalc.progressControl.stop();
};
me.start = function() {
	handler.onStart();
	if (worker) {
		me.changeDisplayOptions();
		worker.postMessage({type:"start",inputs:proxies(dialog.GetValues())});
	} else {
		Planetcalc.progressControl.clear();
		me.result = null;
		me.refresh();
	}
};me.getInputs = function() {
	return inputs;
};
function objectValues( a, o ) {
	for(var n in o) {
		a.push( o[n] );
	}
}
me.getOutputs = function() {
	var ret = [];
	objectValues( ret, outputs );
	objectValues( ret, diagrams );
	objectValues( ret, renderers );
	return ret;
};me.refresh = function ( ) {me.doit();};
me.setResult = function( res, done ) {outputs.days.SetValue(res.days);outputs.YMD.SetValue(res.YMD);if (done) { handler.onStop();if ( PCF.requestFormulaUpdate( false ) ) { var mjx = window.MathJax; mjx.Hub.Queue(["Typeset",mjx.Hub]);};}}
me.doit = function ( ) {var error =false; try {me.changeDisplayOptions();
var res = Planetcalc.Calculate273({"date1":inputs.date1.GetValue(), "date2":inputs.date2.GetValue()});if ( res ) { if ( me.result ) { for( var n in res ) me.result[n] = res[n]; } else me.result = res; }if ( me.result ) me.setResult( me.result, true );} catch( e ) {
	handler.onStop(e);
}};me.changeDisplayOptions = function () {me.calculateDisplay(new DisplayWrapperInput(inputs.date1), new DisplayWrapperInput(inputs.date2), new DisplayWrapper(outputs.days), new DisplayWrapper(outputs.YMD));dialog.layout();
}
me.calculateDisplay = function ( date1, date2, days, YMD )
 {
};
},{calculate:"Рассчитать", stop:"Остановить"});;
hd.initdialog(dlg);dlg.addHandler(hd);window.dialoghandlerv5d6e4ddf862d1 = hd;});
<code>

тут используются динамические функции судя по названию функции, или какой-нибудь встроенный модуль со сборщиком от пи... злоумышленников)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы