react-toolbox/components/utils/time.js

337 lines
16 KiB
JavaScript
Raw Normal View History

2017-01-26 20:05:32 +03:00
import hasOwnProperty from './hasOwnProperty';
const dateLocales = {
2016-11-09 20:34:54 +03:00
de: {
months: 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),
monthsShort: 'Jan_Feb_März_Apr_Mai_Juni_Juli_Aug_Sept_Okt_Nov_Dez'.split('_'),
2016-11-09 20:40:53 +03:00
weekdays: 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'),
weekdaysShort: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
2017-01-26 20:05:32 +03:00
weekdaysLetter: 'S_M_D_M_D_F_S'.split('_'),
2016-11-09 20:34:54 +03:00
},
2016-11-22 11:52:00 +03:00
no: {
months: 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'),
monthsShort: 'jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.'.split('_'),
weekdays: 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),
weekdaysShort: 'søn_man_tir_ons_tor_fre_lør'.split('_'),
2017-01-26 20:05:32 +03:00
weekdaysLetter: [],
},
en: {
months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
2017-01-26 20:05:32 +03:00
weekdaysLetter: [],
},
es: {
months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'),
monthsShort: 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),
weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
2017-01-26 20:05:32 +03:00
weekdaysLetter: 'D_L_M_X_J_V_S'.split('_'),
},
af: {
months: 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split('_'),
monthsShort: 'Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'),
weekdays: 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split('_'),
weekdaysShort: 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'),
2017-01-26 20:05:32 +03:00
weekdaysLetter: [],
},
ar: {
months: ['كانون الثاني يناير', 'شباط فبراير', 'آذار مارس', 'نيسان أبريل', 'أيار مايو', 'حزيران يونيو', 'تموز يوليو', 'آب أغسطس', 'أيلول سبتمبر', 'تشرين الأول أكتوبر', 'تشرين الثاني نوفمبر', 'كانون الأول ديسمبر'],
monthsShort: ['كانون الثاني يناير', 'شباط فبراير', 'آذار مارس', 'نيسان أبريل', 'أيار مايو', 'حزيران يونيو', 'تموز يوليو', 'آب أغسطس', 'أيلول سبتمبر', 'تشرين الأول أكتوبر', 'تشرين الثاني نوفمبر', 'كانون الأول ديسمبر'],
weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
2017-01-26 20:05:32 +03:00
weekdaysLetter: [],
},
be: {
months: 'студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань'.split('_'),
monthsShort: 'студ_лют_сак_красрав_чэрв_ліп_жнів_вераст_ліст_снеж'.split('_'),
weekdays: 'нядзеля_панядзелак_аўторак_серадаацвер_пятніца_субота'.split('_'),
weekdaysShort: 'нд_пн_ат_ср_чц_пт_сб'.split('_'),
2017-01-26 20:05:32 +03:00
weekdaysLetter: [],
},
bg: {
months: 'януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември'.split('_'),
monthsShort: 'янрев_мар_апрай_юни_юли_авг_сеп_окт_ноеек'.split('_'),
weekdays: еделя_понеделник_вторник_срядаетвъртък_петък_събота'.split('_'),
weekdaysShort: ед_пон_вто_сря_чет_пет_съб'.split('_'),
2017-01-26 20:05:32 +03:00
weekdaysLetter: [],
},
bn: {
months: 'জানুয়ারী_ফেবুয়ারী_মার্চ_এপ্রিল_মে_জুন_জুলাই_অগাস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split('_'),
monthsShort: 'জানু_ফেব_মার্চ_এপর_মে_জুন_জুল_অগ_সেপ্ট_অক্টো_নভ_ডিসেম্'.split('_'),
weekdays: 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পত্তিবার_শুক্রবার_শনিবার'.split('_'),
weekdaysShort: 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পত্তি_শুক্র_শনি'.split('_'),
2017-01-26 20:05:32 +03:00
weekdaysLetter: [],
},
bo: {
months: 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'),
monthsShort: 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'),
weekdays: 'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split('_'),
weekdaysShort: 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'),
2017-01-26 20:05:32 +03:00
weekdaysLetter: [],
},
br: {
months: 'Genver_C\'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split('_'),
monthsShort: 'Gen_C\'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'),
weekdays: 'Sul_Lun_Meurzh_Merc\'her_Yaou_Gwener_Sadorn'.split('_'),
weekdaysShort: 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'),
2017-01-26 20:05:32 +03:00
weekdaysLetter: [],
},
bs: {
months: 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split('_'),
monthsShort: 'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split('_'),
weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'),
weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
2017-01-26 20:05:32 +03:00
weekdaysLetter: [],
},
ca: {
months: 'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split('_'),
monthsShort: 'gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.'.split('_'),
weekdays: 'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split('_'),
weekdaysShort: 'dg._dl._dt._dc._dj._dv._ds.'.split('_'),
2017-01-26 20:05:32 +03:00
weekdaysLetter: 'Dg_Dl_Dt_Dc_Dj_Dv_Ds'.split('_'),
},
gl: {
months: 'Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro'.split('_'),
monthsShort: 'Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.'.split('_'),
weekdays: 'Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado'.split('_'),
weekdaysShort: 'Dom._Lun._Mar._Mér._Xov._Ven._Sáb.'.split('_'),
2017-01-26 20:05:32 +03:00
weekdaysLetter: 'Do_Lu_Ma_Mé_Xo_Ve_Sá'.split('_'),
},
eu: {
months: 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split('_'),
monthsShort: 'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split('_'),
weekdays: 'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split('_'),
weekdaysShort: 'ig._al._ar._az._og._ol._lr.'.split('_'),
2017-01-26 20:05:32 +03:00
weekdaysLetter: 'ig_al_ar_az_og_ol_lr'.split('_'),
},
pt: {
months: 'Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro'.split('_'),
monthsShort: 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'),
weekdays: 'Domingo_Segunda-Feira_Terça-Feira_Quarta-Feira_Quinta-Feira_Sexta-Feira_Sábado'.split('_'),
weekdaysShort: 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'),
2017-01-26 20:05:32 +03:00
weekdaysLetter: [],
},
it: {
months: 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'),
monthsShort: 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'),
weekdays: 'Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato'.split('_'),
weekdaysShort: 'Dom_Lun_Mar_Mer_Gio_Ven_Sab'.split('_'),
2017-01-26 20:05:32 +03:00
weekdaysLetter: [],
},
fr: {
months: 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),
monthsShort: 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),
weekdays: 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
weekdaysShort: 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
2017-01-26 20:05:32 +03:00
weekdaysLetter: [],
2016-09-12 13:34:16 +03:00
},
ru: {
months: 'Январь_Февраль_Март_Апрель_Май_Июнь_Июль_Август_Сентябрь_Октябрь_Ноябрь_Декабрь'.split('_'),
2016-09-12 13:34:16 +03:00
monthsShort: 'Янв_Фев_Мар_Апр_Май_Июн_Июл_Авг_Сен_Окт_Ноя_Дек'.split('_'),
weekdays: 'Воскресеньеонедельник_Вторник_Средаетверг_Пятница_Суббота'.split('_'),
weekdaysShort: 'Вс_Пн_Вт_Ср_Чт_Пт_Сб'.split('_'),
2017-01-26 20:05:32 +03:00
weekdaysLetter: [],
2016-10-10 11:08:30 +03:00
},
ua: {
months: 'Січень_Лютий_Березень_Квітень_Травень_Червень_Липень_Серпень_Вересень_Жовтень_Листопад_Грудень'.split('_'),
monthsShort: 'Січ_Лют_Берез_Квіт_Трав_Черв_Лип_Серп_Вересовт_Листоп_Груд'.split('_'),
weekdays: 'Неділя_Понеділок_Вівторок_Середаетверятниця_Субота'.split('_'),
weekdaysShort: 'Нд_Пн_Вт_Ср_Чт_Пт_Сб'.split('_'),
2017-01-26 20:05:32 +03:00
weekdaysLetter: [],
},
2017-04-02 15:08:45 +03:00
'zh-cn': {
months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),
monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
weekdaysShort: '周日_周一_周二_周三_周四_周五_周六'.split('_'),
weekdaysLetter: '日_一_二_三_四_五_六'.split('_'),
},
'zh-hk': {
months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),
monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
weekdaysShort: '週日_週一_週二_週三_週四_週五_週六'.split('_'),
weekdaysLetter: '日_一_二_三_四_五_六'.split('_'),
},
'zh-tw': {
months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),
monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
weekdaysShort: '週日_週一_週二_週三_週四_週五_週六'.split('_'),
weekdaysLetter: '日_一_二_三_四_五_六'.split('_'),
},
};
2016-11-22 11:52:00 +03:00
const time = {
2017-01-26 20:05:32 +03:00
getDaysInMonth(d) {
const resultDate = this.getFirstDayOfMonth(d);
2015-09-05 02:11:51 +03:00
resultDate.setMonth(resultDate.getMonth() + 1);
resultDate.setDate(resultDate.getDate() - 1);
return resultDate.getDate();
},
2017-01-26 20:05:32 +03:00
getFirstDayOfMonth(d) {
2015-09-05 02:11:51 +03:00
return new Date(d.getFullYear(), d.getMonth(), 1);
},
2017-01-26 20:05:32 +03:00
getFirstWeekDay(d) {
2015-09-05 02:11:51 +03:00
return this.getFirstDayOfMonth(d).getDay();
},
2017-01-26 20:05:32 +03:00
getTimeMode(d) {
2015-09-05 02:11:51 +03:00
return d.getHours() >= 12 ? 'pm' : 'am';
},
2017-01-26 20:05:32 +03:00
getFullMonth(d, locale = 'en') {
const month = d.getMonth();
const l = ((typeof locale === 'string') ? dateLocales[locale] : locale) || dateLocales.en;
2017-01-26 20:05:32 +03:00
return (hasOwnProperty(l, 'months'))
? l.months[month] || 'Unknown'
: 'Unknown';
2015-09-05 02:11:51 +03:00
},
2017-01-26 20:05:32 +03:00
getShortMonth(d, locale = 'en') {
const month = d.getMonth();
const l = ((typeof locale === 'string') ? dateLocales[locale] : locale) || dateLocales.en;
2017-01-26 20:05:32 +03:00
return (hasOwnProperty(l, 'monthsShort'))
? l.monthsShort[month] || 'Unknown'
: 'Unknown';
2015-09-05 02:11:51 +03:00
},
2017-01-26 20:05:32 +03:00
getFullDayOfWeek(day, locale = 'en') {
const l = ((typeof locale === 'string') ? dateLocales[locale] : locale) || dateLocales.en;
2017-01-26 20:05:32 +03:00
return (hasOwnProperty(l, 'weekdays'))
? l.weekdays[day] || 'Unknown'
: 'Unknown';
2015-09-05 02:11:51 +03:00
},
2017-01-26 20:05:32 +03:00
getShortDayOfWeek(day, locale = 'en') {
const l = ((typeof locale === 'string') ? dateLocales[locale] : locale) || dateLocales.en;
2017-01-26 20:05:32 +03:00
return (hasOwnProperty(l, 'weekdaysShort'))
? l.weekdaysShort[day] || 'Unknown'
: 'Unknown';
},
2017-01-26 20:05:32 +03:00
getDayOfWeekLetter(day, locale = 'en') {
const l = ((typeof locale === 'string') ? dateLocales[locale] : locale) || dateLocales.en;
2017-01-26 20:05:32 +03:00
return (hasOwnProperty(l, 'weekdaysLetter'))
? l.weekdaysLetter[day] || this.getFullDayOfWeek(day, locale).charAt(0)
: 'Unknown';
2015-09-05 02:11:51 +03:00
},
2017-01-26 20:05:32 +03:00
clone(d) {
2015-09-05 02:11:51 +03:00
return new Date(d.getTime());
},
2017-01-26 20:05:32 +03:00
cloneAsDate(d) {
const clonedDate = this.clone(d);
2015-09-05 02:11:51 +03:00
clonedDate.setHours(0, 0, 0, 0);
return clonedDate;
},
2017-01-26 20:05:32 +03:00
isDateObject(d) {
2015-09-05 02:11:51 +03:00
return d instanceof Date;
},
2017-01-26 20:05:32 +03:00
addDays(d, days) {
const newDate = this.clone(d);
2015-09-05 02:11:51 +03:00
newDate.setDate(d.getDate() + days);
return newDate;
},
2017-01-26 20:05:32 +03:00
addMonths(d, months) {
const newDate = this.clone(d);
newDate.setMonth(d.getMonth() + months, 1);
2015-09-05 02:11:51 +03:00
return newDate;
},
2017-01-26 20:05:32 +03:00
addYears(d, years) {
const newDate = this.clone(d);
2015-09-05 02:11:51 +03:00
newDate.setFullYear(d.getFullYear() + years);
return newDate;
},
2017-01-26 20:05:32 +03:00
setDay(d, day) {
const newDate = this.clone(d);
2015-09-05 02:11:51 +03:00
newDate.setDate(day);
return newDate;
},
2017-01-26 20:05:32 +03:00
setMonth(d, month) {
const newDate = this.clone(d);
2015-09-05 02:11:51 +03:00
newDate.setMonth(month);
return newDate;
},
2017-01-26 20:05:32 +03:00
setYear(d, year) {
const newDate = this.clone(d);
2015-09-05 02:11:51 +03:00
newDate.setFullYear(year);
return newDate;
},
2017-01-26 20:05:32 +03:00
setHours(d, hours) {
const newDate = this.clone(d);
2015-09-05 02:11:51 +03:00
newDate.setHours(hours);
return newDate;
},
2017-01-26 20:05:32 +03:00
setMinutes(d, minutes) {
const newDate = this.clone(d);
2015-09-05 21:29:06 +03:00
newDate.setMinutes(minutes);
2015-09-05 02:11:51 +03:00
return newDate;
},
2017-01-26 20:05:32 +03:00
toggleTimeMode(d) {
const newDate = this.clone(d);
const hours = newDate.getHours();
2015-09-05 02:11:51 +03:00
newDate.setHours(hours - (hours > 12 ? -12 : 12));
return newDate;
2015-09-05 23:31:17 +03:00
},
2017-01-26 20:05:32 +03:00
formatTime(date, format) {
2015-09-05 23:31:17 +03:00
let hours = date.getHours();
let mins = date.getMinutes().toString();
if (format === 'ampm') {
const isAM = hours < 12;
const additional = isAM ? ' am' : ' pm';
2015-09-05 23:31:17 +03:00
2017-01-26 20:05:32 +03:00
hours %= 12;
2015-09-05 23:31:17 +03:00
hours = (hours || 12).toString();
2017-01-26 20:05:32 +03:00
if (mins.length < 2) mins = `0${mins}`;
2015-09-05 23:31:17 +03:00
2017-01-26 20:05:32 +03:00
return hours + (mins === '00' ? '' : `:${mins}`) + additional;
2015-09-05 23:31:17 +03:00
}
hours = hours.toString();
2017-01-26 20:05:32 +03:00
if (hours.length < 2) hours = `0${hours}`;
if (mins.length < 2) mins = `0${mins}`;
return `${hours}:${mins}`;
},
2017-01-26 20:05:32 +03:00
dateOutOfRange(date, minDate, maxDate) {
return ((minDate && !(date >= minDate)) || (maxDate && !(date <= maxDate)));
},
2017-01-26 20:05:32 +03:00
closestDate(to, date1, date2) {
2016-07-21 17:47:03 +03:00
const toTime = to.getTime();
const diff1 = Math.abs(toTime - date1.getTime());
const diff2 = Math.abs(toTime - date2.getTime());
return diff1 < diff2 ? date1 : date2;
},
2017-01-26 20:05:32 +03:00
formatDate(date, locale = 'en') {
if (locale === 'en') {
return `${date.getDate()} ${time.getFullMonth(date, locale)} ${date.getFullYear()}`;
}
2017-01-26 20:05:32 +03:00
return `${date.getDate()}/${date.getMonth() + 1}/${date.getFullYear()}`;
},
2015-09-05 02:11:51 +03:00
};
export default time;