You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

285 lines
7.5 KiB

/*
** Zabbix
** Copyright (C) 2001-2023 Zabbix SIA
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation; either version 2 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
**/
var CDate = function () {
this.clientDate = (arguments.length > 0)
? new Date(arguments[0])
: new Date();
this.calcTZdiff(this.clientDate.getTime());
this.serverDate = new Date(this.clientDate.getTime() - this.tzDiff * 1000);
};
CDate.prototype = {
server: 0, // getTime uses clients :0, or servers time :1
tzDiff: 0, // server and client TZ diff
clientDate: null, // clients(JS, Browser) date object
serverDate: null, // servers(PHP, Unix) date object
calcTZdiff: function(time) {
if (time === undefined) {
time = new Date().getTime();
}
const timestamp = Object.keys(PHP_TZ_OFFSETS).reverse().find((ts) => ts * 1000 <= time);
this.tzDiff = this.clientDate.getTimezoneOffset() * -60 - PHP_TZ_OFFSETS[timestamp];
},
/**
* Formats date according given format. Uses server timezone.
* Supported formats: 'd M Y H:i', 'j. M Y G:i', 'Y/m/d H:i', 'Y-m-d H:i', 'Y-m-d H:i:s', 'Y-m-d', 'H:i:s', 'H:i',
* 'M jS, Y h:i A', 'Y M d H:i', 'd.m.Y H:i' and 'd m Y H i'
* Format 'd m Y H i' is also accepted but used internally for date input fields.
*
* @param format PHP style date format limited to supported formats
*
* @return string|bool human readable date or false if unsupported format given
*/
format: function(format) {
var shortMn = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
var dt = this.getDate(),
mnth = this.getMonth(),
yr = this.getFullYear(),
hrs = this.getHours(),
mnts = this.getMinutes(),
sec = this.getSeconds();
/**
* Append date suffix according to English rules e.g., 3 becomes 3rd.
*
* @param int date
*
* @return string
*/
var appSfx = function(date) {
if (date % 10 == 1 && date != 11) {
return date + 'st';
}
if (date % 10 == 2 && date != 12) {
return date + 'nd';
}
if (date % 10 == 3 && date != 13) {
return date + 'rd';
}
return date + 'th';
};
switch (format) {
case 'd M Y H:i':
return appendZero(dt) + ' ' + shortMn[mnth] + ' ' + yr + ' ' + appendZero(hrs) + ':' + appendZero(mnts);
case 'j. M Y G:i':
return dt + '. ' + shortMn[mnth] + ' ' + yr + ' ' + hrs + ':' + appendZero(mnts);
case 'Y/m/d H:i':
return yr + '/' + appendZero(mnth + 1) + '/' + appendZero(dt) + ' ' + appendZero(hrs) + ':' +
appendZero(mnts);
case 'Y-m-d H:i':
return yr + '-' + appendZero(mnth + 1) + '-' + appendZero(dt) + ' ' + appendZero(hrs) + ':' +
appendZero(mnts);
case 'Y-m-d':
return yr + '-' + appendZero(mnth + 1) + '-' + appendZero(dt);
case 'H:i:s':
return appendZero(hrs) + ':' + appendZero(mnts) + ':' + appendZero(sec);
case 'H:i':
return appendZero(hrs) + ':' + appendZero(mnts);
case 'M jS, Y h:i A':
var ampm = (hrs < 12) ? 'AM' : 'PM';
hrs = appendZero((hrs + 11) % 12 + 1);
return shortMn[mnth] + ' ' + appSfx(dt) + ', ' + yr + ' ' + hrs + ':' + appendZero(mnts) + ' ' + ampm;
case 'Y M d H:i':
return yr + ' ' + shortMn[mnth] + ' ' +appendZero(dt) + ' ' + appendZero(hrs) + ':' + appendZero(mnts);
case 'd.m.Y H:i':
return appendZero(dt) + '.' + appendZero(mnth + 1) + '.' + yr + ' ' + appendZero(hrs) + ':' +
appendZero(mnts);
case 'd. m. Y H:i':
return appendZero(dt) + '. ' + appendZero(mnth + 1) + '. ' + yr + ' ' + appendZero(hrs) + ':' +
appendZero(mnts);
// date format used for date input fields
case 'd m Y H i':
return appendZero(dt) + ' ' + appendZero(mnth + 1) + ' ' + yr + ' ' + appendZero(hrs) + ' ' +
appendZero(mnts);
default:
// defaults to Y-m-d H:i:s
return yr + '-' + appendZero(mnth + 1) + '-' + appendZero(dt) + ' ' + appendZero(hrs) + ':' +
appendZero(mnts) + ':' + appendZero(sec);
}
},
getZBXDate: function() {
var thedate = [];
thedate[0] = this.serverDate.getDate();
thedate[1] = this.serverDate.getMonth() + 1;
thedate[2] = this.serverDate.getFullYear();
thedate[3] = this.serverDate.getHours();
thedate[4] = this.serverDate.getMinutes();
thedate[5] = this.serverDate.getSeconds();
for (var i = 0; i < thedate.length; i++) {
if ((thedate[i] + '').length < 2) {
thedate[i] = '0' + thedate[i];
}
}
return '' + thedate[2] + thedate[1] + thedate[0] + thedate[3] + thedate[4] + thedate[5];
},
setZBXDate: function(strdate) {
this.setTimeObject(
strdate.toString().substr(0, 4),
strdate.toString().substr(4, 2) - 1,
strdate.toString().substr(6, 2),
strdate.toString().substr(8, 2),
strdate.toString().substr(10, 2),
strdate.toString().substr(12, 2)
);
return this.getTime();
},
toString: function() {
return this.serverDate.toString();
},
parse: function(arg) {
this.server = 1;
this.serverDate.setTime(Date.parse(arg));
this.calcTZdiff();
return this.getTime();
},
getMilliseconds: function() {
return this.serverDate.getMilliseconds();
},
getSeconds: function() {
return this.serverDate.getSeconds();
},
getMinutes: function() {
return this.serverDate.getMinutes();
},
getHours: function() {
return this.serverDate.getHours();
},
getDay: function() {
return this.serverDate.getDay();
},
getMonth: function() {
return this.serverDate.getMonth();
},
getYear: function() {
return this.serverDate.getYear();
},
getFullYear: function() {
return this.serverDate.getFullYear();
},
getDate: function() {
return this.serverDate.getDate();
},
getTime: function() {
if (this.server == 1) {
return this.serverDate.getTime() + this.tzDiff * 1000;
}
else {
return this.clientDate.getTime();
}
},
setMilliseconds: function(arg) {
this.server = 1;
this.serverDate.setMilliseconds(arg);
this.calcTZdiff();
},
setSeconds: function(arg) {
this.server = 1;
this.serverDate.setSeconds(arg);
this.calcTZdiff();
},
setMinutes: function(arg) {
this.server = 1;
this.serverDate.setMinutes(arg);
this.calcTZdiff();
},
setHours: function(arg) {
this.server = 1;
this.serverDate.setHours(arg);
this.calcTZdiff();
},
setDate: function(arg) {
this.server = 1;
this.serverDate.setDate(arg);
this.calcTZdiff();
},
setTimeObject: function(y, m, d, h, i, s) {
this.server = 1;
function hasAttr(arg) {
return (typeof(arg) != 'undefined' && arg !== null);
}
if (hasAttr(y)) {
this.serverDate.setFullYear(y);
}
if (hasAttr(m) && hasAttr(d)) {
this.serverDate.setMonth(m, d);
}
else if (hasAttr(m)) {
this.serverDate.setMonth(m);
}
else if (hasAttr(d)) {
this.serverDate.setDate(d);
}
if (hasAttr(h)) {
this.serverDate.setHours(h);
}
if (hasAttr(i)) {
this.serverDate.setMinutes(i);
}
if (hasAttr(s)) {
this.serverDate.setSeconds(s);
}
this.calcTZdiff();
},
setTime: function(arg) {
arg = parseInt(arg, 10);
this.server = 0;
this.clientDate.setTime(arg);
this.calcTZdiff(arg);
this.serverDate.setTime(arg - this.tzDiff * 1000);
}
};