Као програмер софтвера, не можете побећи од манипулације датумима. Готово свака апликација коју програмер изгради имаће неку компоненту где корисник треба да добије датум / време, сачува га у бази података и прикаже кориснику.
Питајте било ког програмера о њиховом искуству у руковању датумима и временским зонама и вероватно ће поделити неке ратне приче. Руковање пољима датума и времена сигурно није ракетна наука, али често може бити досадно и склоно грешкама.
Постоји стотине чланака на ту тему, међутим, већина је или превише академска, фокусирајући се на ситне детаље, или је превише разуђена, пружајући кратке исечке кода без много објашњења која их прате. Овај детаљни водич за манипулацију ДатеТиме-ом треба да вам помогне да разумете програмске концепте и најбоље праксе релевантне за време и датум без потребе да претражујете море информација о овој теми.
У овом чланку ћу вам помоћи да јасно размислите о пољима за датум и време и предложићу неке најбоље праксе које вам могу помоћи да избегнете пакао за датум / време. Овде ћемо истражити неке од кључних концепата који су неопходни за исправну манипулацију вредностима датума и времена, формате који су погодни за чување вредности ДатеТиме и њихов пренос преко АПИ-ја и још много тога.
За почетак, прави одговор за продукцијски код је готово увек употреба одговарајуће библиотеке уместо да се сами ваљате. Потенцијалне потешкоће са израчунавањем датума, о којима се говори у овом чланку, само су врх леденог брега, али их је ипак корисно знати, са или без библиотеке.
Библиотеке датума на много начина помажу да вам олакшају живот. Они у великој мери поједностављују рашчлањивање датума, аритметичке и логичке операције датума и форматирање датума. Можете пронаћи поуздану библиотеку датума и за предњи и за задњи крај који ће за вас обавити већину дизања тешких терета.
Међутим, често користимо библиотеке датума не размишљајући о томе како датум / време заправо функционишу. Датум / време је сложен концепт. Грешке које се појаве због нетачног разумевања могу бити изузетно тешке за разумевање и исправљање, чак и уз помоћ библиотека датума. Као програмер, морате да разумете основе и будете у стању да цените проблеме које библиотеке датума решавају како би их максимално искористиле.
Такође, библиотеке датума / времена могу вас одвести само до сада. Све библиотеке података раде тако што вам дају приступ прикладним структурама података које представљају датумско време. Ако податке шаљете и примате путем РЕСТ АПИ-а, на крају ћете требати да датум претворите у низ и обрнуто, јер ЈСОН нема изворну структуру података која представља ДатеТиме. Концепти које сам овде изнео помоћи ће вам да избегнете неке од уобичајених проблема који се могу појавити приликом обављања ових трансформација датума у низ и низа у датум.
Белешка: Иако сам користио ЈаваСцрипт као програмски језик о којем се говори у овом чланку, ово су општи концепти који се у великој мери примењују на готово све програмске језике и њихове библиотеке датума. Дакле, чак и ако никада раније нисте написали ред ЈаваСцрипт-а, слободно наставите да читате, јер у чланку тешко претпостављам неко претходно знање ЈаваСцрипт-а.
ДатеТиме је врло специфичан тренутак у времену. Размислимо о овоме. Док пишем овај чланак, сат на мом лаптопу показује 21. јула 13:29. То називамо „локалним временом“, временом које видим на зидним сатовима око себе и на ручном сату.
Дајте или одвојите неколико минута, ако замолим своју пријатељицу да се нађе у оближњем кафићу у 15:00, могу да очекујем да је видим тамо отприлике у то време. Слично томе, не би било забуне ако бих уместо тога рекао, на пример, „нађимо се за један и по сат“. На овај начин рутински разговарамо о времену са људима који живе у истом граду или временској зони.
Размислимо о другом сценарију: Желим да кажем пријатељу који живи у Упсали у Шведској да желим да разговарам с њим у 17 сати. Шаљем му поруку: „Хеј Антоне, хајде да разговарамо у 17:00“. Одмах добијем одговор: „Ваше време или моје време?“
Антон ми каже да живи у средњоевропској временској зони која је УТЦ + 01: 00. Живим у УТЦ + 05: 45. То значи да је, када имам 17 сати, где живим, 17:00 - 05:45 = 11:15 АМ УТЦ, што у преводу значи 11:15 УТЦ + 01:00 = 12:15 у Уппсали, савршено за обоје од нас.
Такође, имајте на уму разлику између временске зоне (средњоевропско време) и померања временске зоне (УТЦ + 05: 45). Земље могу одлучити да промене померања временске зоне за љетно рачунање времена такође из политичких разлога. Скоро сваке године се мењају правила у најмање једној земљи, што значи да сваки код са тим правилима мора бити ажуриран - вреди размислити од чега зависи ваша база кодова за сваки ниво ваше апликације.
научити програмирати у в
То је још један добар разлог што ћемо у већини случајева препоручити да се само предњи крај бави временским зонама. Када се то не догоди, шта се дешава када се правила која користи ваш механизам базе података не подударају са правилима вашег предњег или задњег дела?
Овај проблем управљања двема различитим верзијама времена, у односу на корисника и у односу на универзално прихваћени стандард, тежак је, чак и више у свету програмирања где је прецизност кључна и чак једна секунда може да направи огромну разлику. Први корак ка решавању ових проблема је чување датума у УТЦ.
Стандардизација времена је дивна, јер морам да сачувам само УТЦ време и док знам временску зону корисника, увек могу да претворим у њихово време. Супротно томе, ако знам локално време корисника и знам његову временску зону, могу то претворити у УТЦ.
Али датуми и времена могу се навести у много различитих формата. За датум можете написати „30. јул“ или „30. јул“ или „7/30“ (или 30/7, у зависности од тога где живите). За то време могли сте да напишете „21:30“ или „2130“.
Научници из целог света окупили су се да би се решили овог проблема и одлучили су се за формат који описује време које програмери заиста воле јер је кратко и прецизно. Волимо да га зовемо „ИСО формат датума“, што је поједностављена верзија проширеног формата ИСО-8601 и изгледа овако:
За 00:00 или УТЦ користимо „З“, што значи Зулу време, друго име за УТЦ.
Пре него што започнемо са најбољим праксама, научићемо о манипулацији датумима помоћу ЈаваСцрипт-а да бисмо стекли разумевање синтаксе и општих концепата. Иако користимо ЈаваСцрипт, ове информације можете лако прилагодити свом омиљеном програмском језику.
Користићемо аритметику датума за решавање уобичајених проблема везаних за датум на које наилази већина програмера.
Мој циљ је да вам олакшам стварање објекта датума из низа и извлачење компоненти из једне. У томе вам може помоћи библиотека за састанке, али увек је боље разумети како се то ради иза кулиса.
Када прљамо руке датумом / временом, лакше је размишљати о проблемима са којима се суочавамо, извући најбоље праксе и кренути даље. Ако желите да пређете на најбоље праксе, слободно то учините, али топло бих вам препоручио да барем прегледате одељак о аритметикама датума у наставку.
Програмски језици садрже корисне конструкције које ће нам олакшати живот. ЈаваСцрипт Date
објект је једна таква ствар. Нуди прикладне методе за добијање тренутног датума и времена, чување датума у променљивој, извршавање аритметике датума и форматирање датума на основу локализације корисника.
Због разлика између примена прегледача и нетачног руковања летњим рачунањем времена (ДСТ), у зависности од објекта Дате за критичне апликације се не препоручује и вероватно бисте требали да користите ДатеТиме библиотеку попут Лукон, дате-фнс или даијс . (Шта год да користите, избегавајте некада популарни Момент.јс - који се често назива moment
, како се појављује у коду - јер је сада застарео.)
Али у образовне сврхе користићемо методе које пружа објекат Дате () да бисмо научили како ЈаваСцрипт рукује са ДатеТиме.
const currentDate = new Date();
Ако ништа не проследите конструктору датума, враћени објект датума садржи тренутни датум и време.
Затим га можете форматирати тако да издвоји само датумски део на следећи начин:
const currentDate = new Date(); const currentDayOfMonth = currentDate.getDate(); const currentMonth = currentDate.getMonth(); // Be careful! January is 0, not 1 const currentYear = currentDate.getFullYear(); const dateString = currentDayOfMonth + '-' + (currentMonth + 1) + '-' + currentYear; // '27-11-2020'
Напомена: Замка „Јануар је 0“ је уобичајена, али не и универзална. Вреди проверити документацију било ког језика (или формата конфигурације: нпр. Црон је нарочито заснован на 1) пре него што почнете да га користите.
Ако уместо тога желите да добијете тренутну временску ознаку, можете да креирате нови објекат Дате и користите методу гетТиме ().
const currentDate = new Date(); const timestamp = currentDate.getTime();
У ЈаваСцрипт-у временска ознака представља број милисекунди које су прошле од 1. јануара 1970.
Ако не намеравате да подржите Претварање низа у ЈаваСцрипт датумски објекат врши се на различите начине. Конструктор објекта Дате прихвата широк спектар формата датума: Имајте на уму да не морате да наводите дан у недељи јер ЈС може да одреди дан у недељи за било који датум. Можете и годину, месец, дан, сате, минуте и секунде да предате као засебне аргументе: Наравно, увек можете користити ИСО формат датума: Међутим, можете налетети на проблеме када временску зону не наведете изричито! Било који од ових два дат ће вам 25. јула 2016. 00:00:00 по локалном времену. Ако користите ИСО формат, чак и ако наведете само датум, а не и временску и временску зону, он ће аутоматски прихватити временску зону као УТЦ. То значи да: Срећом, модерни ЈаваСцрипт има неке погодне функције интернационализације уграђене у стандард За ово ће нам требати два објекта: а Ако бисмо уместо тога желели холандски (Д / М / ГГГГ) формат, само бисмо проследили другачији код културе Или дужи облик америчког формата, са наведеним називом месеца: Сада, ако смо желели одговарајући редни формат дана у месецу - то јест, „14.“ уместо само „14“ - ово нажалост треба мало заобићи, јер су На несрећу, Ако требате подржати старије прегледаче попут ИЕ-а пре верзије 11, форматирање датума у ЈаваСцрипт-у је тврђе јер није било стандардних функција форматирања датума као што су У ПХП-у, на пример, функција Можете користити а различита комбинација слова претходи Ако сте сигурни у формат који желите да користите, најбоље је издвојити појединачне битове помоћу ЈаваСцрипт функција које смо покрили изнад и сами створити низ. Датум можемо добити у формату ММ / ДД / ГГГГ као Проблем овог решења је што може дати недоследну дужину датума јер су неки месеци и дани у месецу једноцифрени, а други двоцифрени. То може бити проблематично, на пример, ако датум приказујете у колони табеле, јер се датуми не поклапају. То можемо да решимо помоћу функције „пад“ која додаје водећу 0. Сада добијамо тачан датум у формату ММ / ДД / ГГГГ користећи: Ако уместо тога желимо ДД-ММ-ГГГГ, поступак је сличан: Подигнимо анте и покушајмо да одштампамо датум у формату „Месечни датум, година“. Требаће нам мапирање индекса месеца у имена: Неки воле да датум прикажу као 1. јануара 2013. Нема проблема, све што нам треба је помоћна функција Лако је одредити дан у недељи из објекта датума, па додајмо то у: Већа поента је у томе што се након што извучете бројеве из датума, форматирање углавном односи на низове. Једном када знате како да рашчланите датум и форматирате га, промена датума из једног формата у други само је питање комбиновања два. На пример, ако имате датум у формату 21. јула 2013. године и желите да промените формат у 21-07-2013, то се може постићи овако: Методе форматирања датума о којима смо претходно разговарали требале би да функционишу у већини апликација, али ако заиста желите да локализујете форматирање датума, предлажем да користите … Даје нам нешто попут Промена локализације у „ен-УС“ уместо тога даје „26. јул 2016.“. Приметите како се форматирање променило, али опције приказа су и даље остале исте - врло корисна карактеристика. Као што је приказано у претходном одељку, новија техника заснована на Са Ако сам уместо тога желео пуни месец „јул“, све што радим је да променим параметар месеца у опцијама на „дугачки“. ЈаваСцрипт све рјешава умјесто мене. За ен-УС, сада добијам 26. јула 2016. Напомена: Ако желите да прегледач аутоматски користи локализацију корисника, као први параметар можете да додате „недефинисано“. Ако желите да прикажете нумеричку верзију датума и не желите да се петљате са ММ / ДД / ГГГГ наспрам ДД / ММ / ГГГГ за различите локације, предлажем следеће једноставно решење: На мом рачунару ово даје Ово даје Такође можете да користите неке друге сродне функције да бисте локализовали начин приказа времена и датума: Ево примера додавања 20 дана ЈаваСцрипт датуму (тј. Откривање датума 20 дана након познатог датума): Изворни датумски објекат сада представља датум 20 дана после 20. јула и Да бисте израчунали релативне временске жигове са прецизнијом разликом од целих дана, можете да користите Као и за све остало везано за датум, и упоређивање датума има своје проблеме. Прво, морамо да направимо објекте датума. Срећом, = = сви послови. Тако да је поређење 19. јула 2014. и 18. јула 2014. лако као: Провера једнакости је замршенија, јер су два датумска објекта који представљају исти датум и даље два различита датумска објекта и неће бити једнака. Поређење низова датума је лоша идеја јер, на пример, „20. јул 2014.“ и „20. јул 2014.“ представљају исти датум, али имају различите репрезентације низова. Исечак испод илуструје прву тачку: Ово ће дати Овај конкретни случај може се поправити упоређивањем целобројних еквивалената датума (њихових временских жигова) на следећи начин: Видео сам овај пример на пуно места, али не свиђа ми се јер обично не креирате датумски објекат од другог датумског објекта. Тако да сматрам да је пример важан само са академске тачке гледишта. Такође, ово захтева да се оба Дате датума односе на потпуно исту секунду, док ћете можда желети да знате да ли се односе на исти дан, сат или минут. Погледајмо практичнији пример. Покушавате да упоредите да ли је рођендан који је корисник унео једнак сретном датуму који добијате од АПИ-ја. Оба су представљала исти датум, али нажалост ваш корисник неће добити милион долара. Ево проблема: ЈаваСцрипт увек претпоставља да је временска зона она коју јој пружа прегледач, осим ако изричито није другачије назначено. То за мене значи Није могуће променити само временску зону постојећег датумског објекта, па је наш циљ сада створити нови датумски објекат, али са УТЦ уместо локалне временске зоне. Занемарићемо корисникову временску зону и користићемо УТЦ током прављења објекта датума. Постоје два начина за то: Ово такође функционише ако не наведете време јер ће то подразумевано бити поноћ (тј. 00: 00: 00З): Запамтите: Ако се конструктору датума преда низ у исправном ИСО формату датума ГГГГ-ММ-ДД, аутоматски се претпоставља УТЦ. Уобичајени сценарио на који ћете наићи је да пронађете разлику између два датума. Разговарамо о два случаја употребе: Претворите оба датума у временску ознаку УТЦ, пронађите разлику у милисекундама и пронађите еквивалентне дане. Напомена: Имамо нестандардни формат. Прочитајте АПИ документ да бисте утврдили да ли то значи 12. октобар или 10. децембар Промените ИСО формат у складу с тим. Знам да постоје сажетији начини за писање овог кода, али волим да га напишем због чисте јасноће логике. Сада када нам је пријатна аритметика у стању смо да разумемо најбоље праксе које треба следити и разлоге за њихово следовање. Ако од корисника добијате датум и време, највероватније тражите његов локални датум. У аритметичком одељку са датумима видели смо да Да бисте уклонили забуну, увек предлажем да направите датум помоћу Супер део је што можете да користите варијације које вам омогућавају да изоставите било који од последња четири параметра ако су нула; тј. На пример, ако користите бирач датума и времена који вам даје датум 2012-10-12 и време 12:30, можете издвојити делове и створити нови објекат Дате на следећи начин: Покушајте да избегнете стварање датума из низа уколико није у ИСО формату датума. Уместо тога користите методу Датум (година, месец, датум, сати, минуте, секунде, микросекунде). Ако добијате само датум, на пример датум рођења корисника, најбоље је да формат претворите у важећи ИСО формат датума како бисте елиминисали све информације о временској зони које могу проузроковати померање датума унапред или уназад када се претвори у УТЦ. На пример: У случају да сте заборавили, ако направите Увек сачувајте ДатеТиме у УТЦ. Увек пошаљите ИСО датумски низ или временску ознаку на задњи крај. Генерације рачунарских програмера схватиле су ову једноставну истину након горких искустава покушавајући да покажу тачно локално време кориснику. Похрањивање локалног времена у позадини је лоша идеја, боље је пустити прегледачу да обрађује претворбу у локално време на предњем крају. Такође, требало би бити очигледно да никада не бисте требали слати низ ДатеТиме као што је „20. јул 1989. 12:10“ на задњи крај. Чак и ако пошаљете и временску зону, повећавате напор другим програмерима да разумеју ваше намере и правилно анализирају и ускладиште датум. Користите „Понекад је важно је знати временску зону у којем се догодио догађај и претварање у једну временску зону неповратно брише те информације. „Ако радите маркетиншку промоцију и желите да знате који су купци наручили око ручка, наруџба која је изгледа постављена у подне по ГМТ није од велике помоћи када је у ствари постављена током доручка у Њујорку.“ Ако наиђете на овакву ситуацију, било би паметније уштедети и локално време. Као и обично, желели бисмо да направимо датум у ИСО формату, али прво морамо да пронађемо померање временске зоне. Објекат Дате | | + + _ | функција нам говори број минута који када се дода датом локалном времену даје еквивалентно УТЦ време. Предлажем да га конвертујете у (+ -) хх: мм формат, јер постаје очигледније да се ради о померању временске зоне. За моју временску зону +05: 45, добијам -345, ово није само супротни знак, већ би број попут -345 могао потпуно збунити позадински програмер. Дакле, претварамо ово у +05: 45. Сада добијамо остатак вредности и креирамо важећи ИСО низ који представља локални ДатеТиме. Ако желите, УТЦ и локалне датуме можете умотати у објекат. Сада, на крају, ако сте желели да сазнате да ли се догађај догодио пре поднева по локалном времену, можете да рашчланите датум и једноставно употребите Нисмо користили Понекад, чак и када је ускладиштена локална временска зона, пожелећете да прикажете датуме у одређеној временској зони. На пример, времена за догађаје могу имати више смисла у временској зони тренутног корисника ако су виртуелни или у временској зони у којој ће се физички одржати, ако нису. У сваком случају, вреди претходно погледати утврђена решења за форматирање са експлицитним именима временских зона. Увек конфигуришите своје сервере и базе података да користе УТЦ временску зону. (Имајте на уму да су УТЦ и ГМТ није иста ствар —ГМТ, на пример, може подразумевати прелазак на БСТ током лета, док УТЦ то никада неће учинити.) Већ смо видели колико претварање временске зоне може бити болно, посебно када је нежељено. Увек слање УТЦ ДатеТиме и конфигурисање сервера да буду у УТЦ временској зони може вам олакшати живот. Ваш позадински код биће много једноставнији и чишћи јер не мора да врши конверзије временских зона. ДатеТиме подаци који долазе са сервера широм света могу се упоређивати и сортирати без напора. Код на задњем крају треба да буде у стању да претпостави да је временска зона сервера УТЦ (али и даље треба да има на месту проверу да би био сигуран). Једноставна провера конфигурације штеди потребу за размишљањем и кодирањем конверзија сваки пут када се напише нови ДатеТиме код. Манипулација датумима је тежак проблем. Концепти иза практичних примера у овом чланку важе изван ЈаваСцрипт-а и само су почетак када је у питању правилно руковање подацима и прорачунима ДатеТиме. Уз то, уз сваку помоћну библиотеку ћете добити свој сет нијанси. Закључак је: Користите ИСО на задњем крају и оставите предњи да бисте правилно форматирали ствари за корисника. Професионални програмери биће свесни неких нијанси и користиће (утолико одлучније) добро подржане ДатеТиме библиотеке на задњем и предњем крају. Уграђене функције на страни базе података су друга прича, али надамо се да овај чланак даје довољно позадине за доношење мудријих одлука и у том контексту.Рашчлањивање датума
Date.now()
const date1 = new Date('Wed, 27 July 2016 13:30:00'); const date2 = new Date('Wed, 27 July 2016 07:45:00 UTC'); const date3 = new Date('27 July 2016 13:30:00 UTC+05:45');
const date = new Date(2016, 6, 27, 13, 30, 0);
const date = new Date('2016-07-27T07:45:00Z');
стратегије управљања девизним ризиком
const date1 = new Date('25 July 2016'); const date2 = new Date('July 25, 2016');
Форматирање датума
new Date('25 July 2016').getTime() !== new Date('2016-07-25').getTime() new Date('2016-07-25').getTime() === new Date('2016-07-25T00:00:00Z').getTime()
простор имена који форматирање датума чине једноставном операцијом.Intl
и Date
, иницијализовано са нашим излазним преференцама. Претпоставимо да бисмо желели да користимо амерички (М / Д / ГГГГ) формат, ово би изгледало овако:Intl.DateTimeFormat
const firstValentineOfTheDecade = new Date(2020, 1, 14); // 1 for February const enUSFormatter = new Intl.DateTimeFormat('en-US'); console.log(enUSFormatter.format(firstValentineOfTheDecade)); // 2/14/2020
конструктор:DateTimeFormat
const nlBEFormatter = new Intl.DateTimeFormat('nl-BE'); console.log(nlBEFormatter.format(firstValentineOfTheDecade)); // 14/2/2020
const longEnUSFormatter = new Intl.DateTimeFormat('en-US', { year: 'numeric', month: 'long', day: 'numeric', }); console.log(longEnUSFormatter.format(firstValentineOfTheDecade)); // February 14, 2020
важеће само вредности овог писања су day
или 'numeric'
. Задуживање Верзија Флавио Цопес-а од Код Матхиас Биненс-а да искористе други део '2-digit'
за ово можемо да прилагодимо излаз у дану месеца преко Intl
:formatToParts()
const pluralRules = new Intl.PluralRules('en-US', { type: 'ordinal' }) const suffixes = { 'one': 'st', 'two': 'nd', 'few': 'rd', 'other': 'th' } const convertToOrdinal = (number) => `${number}${suffixes[pluralRules.select(number)]}` // At this point: // convertToOrdinal('1') === '1st' // convertToOrdinal('2') === '2nd' // etc. const extractValueAndCustomizeDayOfMonth = (part) => { if (part.type === 'day') { return convertToOrdinal(part.value); } return part.value; }; console.log( longEnUSFormatter.formatToParts(firstValentineOfTheDecade) .map(extractValueAndCustomizeDayOfMonth) .join('') ); // February 14th, 2020
није подржан од стране Интернет Екплорер-а (ИЕ) од овог писања, већ све остале технологије за рачунаре, мобилне уређаје и позадинске (тј. Ноде.јс) имају подршку . За оне који требају подржати ИЕ и којима су апсолутно потребни ординали, доњи сиденоте (или боље, одговарајућа библиотека датума) даје одговор.formatToParts
у Питхону или ПХП-у.strftime
даје вам strftime('Today is %b %d %Y %X', mktime(5,10,0,12,30,99))
.Today is Dec 30 1999 05:10:00
да бисте добили датум у различитим форматима. (Пажљиво, сваки језик не додељује исто значење сваком слову - нарочито, „М“ и „м“ могу се заменити минутима и месецима.)%
var currentDate = new Date(); var date = currentDate.getDate(); var month = currentDate.getMonth(); var year = currentDate.getFullYear();
var monthDateYear = (month+1) + '/' + date + '/' + year;
function pad(n) { return n<10 ? '0'+n : n; }
var mmddyyyy = pad(month + 1) + '/' + pad(date) + '/' + year;
var ddmmyyyy = pad(date) + '-' + pad(month + 1) + '-' + year;
var monthNames = [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ]; var dateWithFullMonthName = monthNames[month] + ' ' + pad(date) + ', ' + year;
који враћа 1. за 1, 12. за 12 и 103 за 103 итд., а остало је једноставно:ordinal
var ordinalDate = ordinal(date) + ' ' + monthNames[month] + ', ' + year;
Промена формата датума
var daysOfWeek = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; ordinalDateWithDayOfWeek = daysOfWeek[currentDate.getDay()] + ', ' + ordinalDate;
Коришћење функција локализације објекта ЈаваСцрипт датума
const myDate = new Date('Jul 21, 2013'); const dayOfMonth = myDate.getDate(); const month = myDate.getMonth(); const year = myDate.getFullYear(); function pad(n) { return n<10 ? '0'+n : n } const ddmmyyyy = pad(dayOfMonth) + '-' + pad(month + 1) + '-' + year; // '21-07-2013'
објецт’с Date
метода:toLocaleDateString()
const today = new Date().toLocaleDateString('en-GB', { day: 'numeric', month: 'short', year: 'numeric', });
.26 Jul 2016
делује врло слично овој, али вам омогућава да поново користите објекат форматирања тако да је потребно само једном да подесите опције.Intl.DateTimeFormat
, добра је навика увек пролазити опције форматирања, чак и ако излаз изгледа добро на вашем рачунару. Ово може заштитити кориснички интерфејс од пробијања у неочекиване локације са заиста дугим именима месеци или изгледати непријатно због кратких.анатомија пословног плана
toLocaleDateString()
const today = new Date().toLocaleDateString(undefined, { day: 'numeric', month: 'numeric', year: 'numeric', });
. Ако желите да будете сигурни да месец и датум имају две цифре, само промените опције:7/26/2016
const today = new Date().toLocaleDateString(undefined, { day: '2-digit', month: '2-digit', year: 'numeric', });
. Управо оно што смо желели!
Код Оутпут Опис 07/26/2016
'04:21:38 АМ' Прикажи локализовану верзију само времена now.toLocaleTimeString()
'04: 21: 38 Прикажите локализовано време на основу понуђених опција now.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit', second: '2-digit', });
'22.7.2016, 04:21:38' Прикажите датум и време за локализацију корисника now.toLocaleString()
'22.7.2016, 04:21' Прикажите локализовани датум и време на основу понуђених опција Израчунавање релативних датума и времена
now.toLocaleString(undefined, { day: 'numeric', month: 'numeric', year: 'numeric', hour: '2-digit', minute: '2-digit', });
const myDate = new Date('July 20, 2016 15:00:00'); const nextDayOfMonth = myDate.getDate() + 20; myDate.setDate(nextDayOfMonth); const newDate = myDate.toLocaleString();
садржи локализовани низ који представља тај датум. У мом прегледачу, newDate
садржи „9.8.2016., 15:00:00“.бесплатни хаковани бројеви кредитних картица
newDate
и Date.getTime()
да радите са целим бројевима који представљају број милисекунди од одређене епохе - наиме, 1. јануара 1970. На пример, ако желите да знате када је сада 17 сати након:Date.setTime()
Упоређивање датума
const msSinceEpoch = (new Date()).getTime(); const seventeenHoursLater = new Date(msSinceEpoch + 17 * 60 * 60 * 1000);
const date1 = new Date('July 19, 2014'); const date2 = new Date('July 28, 2014'); if(date1 > date2) { console.log('First date is more recent'); } else { console.log('Second date is more recent'); }
const date1 = new Date('June 10, 2003'); const date2 = new Date(date1); const equalOrNot = date1 == date2 ? 'equal' : 'not equal'; console.log(equalOrNot);
.not equal
date1.getTime() == date2.getTime()
const userEnteredString = '12/20/1989'; // MM/DD/YYYY format const dateStringFromAPI = '1989-12-20T00:00:00Z'; const dateFromUserEnteredString = new Date(userEnteredString) const dateFromAPIString = new Date(dateStringFromAPI); if (dateFromUserEnteredString.getTime() == dateFromAPIString.getTime()) { transferOneMillionDollarsToUserAccount(); } else { doNothing(); }
створиће датум 1989-12-20Т00: 00: 00: 00 + 5: 45 или 1989-12-19Т18: 15: 00З који није исти као 1989-12-20Т00: 00: 00З у погледу временског жига.
new Date ('12/20/1989')
const userEnteredDate = '12/20/1989'; const parts = userEnteredDate.split('/'); const userEnteredDateISO = parts[2] + '-' + parts[0] + '-' + parts[1]; const userEnteredDateObj = new Date(userEnteredDateISO + 'T00:00:00Z'); const dateFromAPI = new Date('1989-12-20T00:00:00Z'); const result = userEnteredDateObj.getTime() == dateFromAPI.getTime(); // true
const userEnteredDate = new Date('1989-12-20'); const dateFromAPI = new Date('1989-12-20T00:00:00Z'); const result = userEnteredDate.getTime() == dateFromAPI.getTime(); // true
Проналажење разлике између два датума
Проналажење броја дана између два датума
const userEnteredDate = new Date('12/20/1989'); const userEnteredDateTimeStamp = Date.UTC(userEnteredDate.getFullYear(), userEnteredDate.getMonth(), userEnteredDate.getDate(), 0, 0, 0); const dateFromAPI = new Date('1989-12-20T00:00:00Z'); const result = userEnteredDateTimeStamp == dateFromAPI.getTime(); // true ...
Проналажење старости корисника од датума рођења
const dateFromAPI = '2016-02-10T00:00:00Z'; const now = new Date(); const datefromAPITimeStamp = (new Date(dateFromAPI)).getTime(); const nowTimeStamp = now.getTime(); const microSecondsDiff = Math.abs(datefromAPITimeStamp - nowTimeStamp); // Math.round is used instead of Math.floor to account for certain DST cases // Number of milliseconds per day = // 24 hrs/day * 60 minutes/hour * 60 seconds/minute * 1000 ms/second const daysDiff = Math.round(microSecondsDiff / (1000 * 60 * 60 * 24)); console.log(daysDiff);
const birthDateFromAPI = '12/10/1989';
Предлози за избегавање пакла
Добијање датума од корисника
const parts = birthDateFromAPI.split('/'); const birthDateISO = parts[2] + '-' + parts[0] + '-' + parts[1]; const birthDate = new Date(birthDateISO); const today = new Date(); let age = today.getFullYear() - birthDate.getFullYear(); if(today.getMonth()
Date
формат, чак и ако датум већ имате у важећем формату који се може рашчланити. Ако се сви програмери у вашем тиму придржавају овог једноставног правила, биће изузетно лако дугорочно одржавати код, јер је онолико експлицитан колико и са new Date(year, month, day, hours, minutes, seconds, milliseconds)
конструктор.Date
је исто што и new Date(2012, 10, 12)
јер се неспецификовани параметри подразумевају на нулу.new Date(2012, 10, 12, 0, 0, 0, 0)
Добијање само датума
const dateFromPicker = '2012-10-12'; const timeFromPicker = '12:30'; const dateParts = dateFromPicker.split('-'); const timeParts = timeFromPicker.split(':'); const localDate = new Date(dateParts[0], dateParts[1]-1, dateParts[2], timeParts[0], timeParts[1]);
const dateFromPicker = '12/20/2012'; const dateParts = dateFromPicker.split('/'); const ISODate = dateParts[2] + '-' + dateParts[0] + '-' + dateParts[1]; const birthDate = new Date(ISODate).toISOString();
објект са улазом у важећем ИСО формату датума (ГГГГ-ММ-ДД), подразумевано ће бити УТЦ уместо да подразумевано подешава временску зону прегледача.Чување датума
Date
или toISOString()
методе објекта Дате за претварање локалног ДатеТиме у УТЦ.toJSON()
Приказ датума и времена
const dateFromUI = '12-13-2012'; const timeFromUI = '10:20'; const dateParts = dateFromUI.split('-'); const timeParts = timeFromUI.split(':'); const date = new Date(dateParts[2], dateParts[0]-1, dateParts[1], timeParts[0], timeParts[1]); const dateISO = date.toISOString(); $.post('http://example.com/', {date: dateISO}, ...)
објект.Date
или toLocaleString()
и toLocaleDateString()
методе или библиотека датума за приказ локалног времена.toLocaleTimeString()
Када треба да чувате и локално време?
const dateFromAPI = '2016-01-02T12:30:00Z'; const localDate = new Date(dateFromAPI); const localDateString = localDate.toLocaleDateString(undefined, { day: 'numeric', month: 'short', year: 'numeric', }); const localTimeString = localDate.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit', second: '2-digit', });
getTimeZoneOffset()
const now = new Date(); const tz = now.gettime zoneOffset();
const sign = tz > 0 ? '-' : '+'; const hours = pad(Math.floor(Math.abs(tz)/60)); const minutes = pad(Math.abs(tz)%60); const tzOffset = sign + hours + ':' + minutes;
const localDateTime = now.getFullYear() + '-' + pad(now.getMonth()+1) + '-' + pad(now.getDate()) + 'T' + pad(now.getHours()) + ':' + pad(now.getMinutes()) + ':' + pad(now.getSeconds());
функцију.const eventDate = { utc: now.toISOString(), local: localDateTime, tzOffset: tzOffset, }
getHours()
овде, али га и даље складиштимо јер ће нам можда требати у будућности за сврхе отклањања грешака. Заправо бисте могли само послати офсет временске зоне и само УТЦ време. Али и ја волим да чувам локално време, јер ћете на крају морати да сачувате датум у бази података, а одвојено ускладиштено локално време омогућава вам директно упитивање на основу поља, уместо да морате да вршите прорачуне да бисте добили локални датум.Конфигурација сервера и базе података
који алат би програмер користио за визуелизацију односа између модула
Време је за боље руковање датумима