portaldacalheta.pt
  • Главни
  • Агиле Талент
  • Финансијски Процеси
  • Дизајн Бренда
  • Трендови
Бацк-Енд

Дефинитиван водич за манипулацију датумом и временом



Као програмер софтвера, не можете побећи од манипулације датумима. Готово свака апликација коју програмер изгради имаће неку компоненту где корисник треба да добије датум / време, сачува га у бази података и прикаже кориснику.

Питајте било ког програмера о њиховом искуству у руковању датумима и временским зонама и вероватно ће поделити неке ратне приче. Руковање пољима датума и времена сигурно није ракетна наука, али често може бити досадно и склоно грешкама.



Постоји стотине чланака на ту тему, међутим, већина је или превише академска, фокусирајући се на ситне детаље, или је превише разуђена, пружајући кратке исечке кода без много објашњења која их прате. Овај детаљни водич за манипулацију ДатеТиме-ом треба да вам помогне да разумете програмске концепте и најбоље праксе релевантне за време и датум без потребе да претражујете море информација о овој теми.



У овом чланку ћу вам помоћи да јасно размислите о пољима за датум и време и предложићу неке најбоље праксе које вам могу помоћи да избегнете пакао за датум / време. Овде ћемо истражити неке од кључних концепата који су неопходни за исправну манипулацију вредностима датума и времена, формате који су погодни за чување вредности ДатеТиме и њихов пренос преко АПИ-ја и још много тога.



За почетак, прави одговор за продукцијски код је готово увек употреба одговарајуће библиотеке уместо да се сами ваљате. Потенцијалне потешкоће са израчунавањем датума, о којима се говори у овом чланку, само су врх леденог брега, али их је ипак корисно знати, са или без библиотеке.

ДатеТиме библиотеке помажу вам ако их правилно разумете

Библиотеке датума на много начина помажу да вам олакшају живот. Они у великој мери поједностављују рашчлањивање датума, аритметичке и логичке операције датума и форматирање датума. Можете пронаћи поуздану библиотеку датума и за предњи и за задњи крај који ће за вас обавити већину дизања тешких терета.



Међутим, често користимо библиотеке датума не размишљајући о томе како датум / време заправо функционишу. Датум / време је сложен концепт. Грешке које се појаве због нетачног разумевања могу бити изузетно тешке за разумевање и исправљање, чак и уз помоћ библиотека датума. Као програмер, морате да разумете основе и будете у стању да цените проблеме које библиотеке датума решавају како би их максимално искористиле.

Такође, библиотеке датума / времена могу вас одвести само до сада. Све библиотеке података раде тако што вам дају приступ прикладним структурама података које представљају датумско време. Ако податке шаљете и примате путем РЕСТ АПИ-а, на крају ћете требати да датум претворите у низ и обрнуто, јер ЈСОН нема изворну структуру података која представља ДатеТиме. Концепти које сам овде изнео помоћи ће вам да избегнете неке од уобичајених проблема који се могу појавити приликом обављања ових трансформација датума у ​​низ и низа у датум.



Белешка: Иако сам користио ЈаваСцрипт као програмски језик о којем се говори у овом чланку, ово су општи концепти који се у великој мери примењују на готово све програмске језике и њихове библиотеке датума. Дакле, чак и ако никада раније нисте написали ред ЈаваСцрипт-а, слободно наставите да читате, јер у чланку тешко претпостављам неко претходно знање ЈаваСцрипт-а.

Стандардизација времена

ДатеТиме је врло специфичан тренутак у времену. Размислимо о овоме. Док пишем овај чланак, сат на мом лаптопу показује 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 и изгледа овако:

Слика која приказује поједностављену верзију проширеног формата ИСО-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.

Ако не намеравате да подржите

Рашчлањивање датума

Претварање низа у ЈаваСцрипт датумски објекат врши се на различите начине.

Конструктор објекта Дате прихвата широк спектар формата датума:

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');

Било који од ових два дат ће вам 25. јула 2016. 00:00:00 по локалном времену.

стратегије управљања девизним ризиком

Ако користите ИСО формат, чак и ако наведете само датум, а не и временску и временску зону, он ће аутоматски прихватити временску зону као УТЦ.

То значи да:

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

Сада, ако смо желели одговарајући редни формат дана у месецу - то јест, „14.“ уместо само „14“ - ово нажалост треба мало заобићи, јер су 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 није подржан од стране Интернет Екплорер-а (ИЕ) од овог писања, већ све остале технологије за рачунаре, мобилне уређаје и позадинске (тј. Ноде.јс) имају подршку . За оне који требају подржати ИЕ и којима су апсолутно потребни ординали, доњи сиденоте (или боље, одговарајућа библиотека датума) даје одговор.

Ако требате подржати старије прегледаче попут ИЕ-а пре верзије 11, форматирање датума у ​​ЈаваСцрипт-у је тврђе јер није било стандардних функција форматирања датума као што су 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();

Проблем овог решења је што може дати недоследну дужину датума јер су неки месеци и дани у месецу једноцифрени, а други двоцифрени. То може бити проблематично, на пример, ако датум приказујете у колони табеле, јер се датуми не поклапају.

То можемо да решимо помоћу функције „пад“ која додаје водећу 0.

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;

Неки воле да датум прикажу као 1. јануара 2013. Нема проблема, све што нам треба је помоћна функција 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;

Већа поента је у томе што се након што извучете бројеве из датума, форматирање углавном односи на низове.

Промена формата датума

Једном када знате како да рашчланите датум и форматирате га, промена датума из једног формата у други само је питање комбиновања два.

На пример, ако имате датум у формату 21. јула 2013. године и желите да промените формат у 21-07-2013, то се може постићи овако:

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. јул 2016.“. Приметите како се форматирање променило, али опције приказа су и даље остале исте - врло корисна карактеристика. Као што је приказано у претходном одељку, новија техника заснована на 26 Jul 2016 делује врло слично овој, али вам омогућава да поново користите објекат форматирања тако да је потребно само једном да подесите опције.

Са Intl.DateTimeFormat, добра је навика увек пролазити опције форматирања, чак и ако излаз изгледа добро на вашем рачунару. Ово може заштитити кориснички интерфејс од пробијања у неочекиване локације са заиста дугим именима месеци или изгледати непријатно због кратких.

анатомија пословног плана

Ако сам уместо тога желео пуни месец „јул“, све што радим је да променим параметар месеца у опцијама на „дугачки“. ЈаваСцрипт све рјешава умјесто мене. За ен-УС, сада добијам 26. јула 2016.

Напомена: Ако желите да прегледач аутоматски користи локализацију корисника, као први параметар можете да додате „недефинисано“.

Ако желите да прикажете нумеричку верзију датума и не желите да се петљате са ММ / ДД / ГГГГ наспрам ДД / ММ / ГГГГ за различите локације, предлажем следеће једноставно решење:

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' Прикажите локализовани датум и време на основу понуђених опција

Израчунавање релативних датума и времена

Ево примера додавања 20 дана ЈаваСцрипт датуму (тј. Откривање датума 20 дана након познатог датума):

now.toLocaleString(undefined, { day: 'numeric', month: 'numeric', year: 'numeric', hour: '2-digit', minute: '2-digit', });

Изворни датумски објекат сада представља датум 20 дана после 20. јула и 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()

Упоређивање датума

Као и за све остало везано за датум, и упоређивање датума има своје проблеме.

Прво, морамо да направимо објекте датума. Срећом, = = сви послови. Тако да је поређење 19. јула 2014. и 18. јула 2014. лако као:

const msSinceEpoch = (new Date()).getTime(); const seventeenHoursLater = new Date(msSinceEpoch + 17 * 60 * 60 * 1000);

Провера једнакости је замршенија, јер су два датумска објекта који представљају исти датум и даље два различита датумска објекта и неће бити једнака. Поређење низова датума је лоша идеја јер, на пример, „20. јул 2014.“ и „20. јул 2014.“ представљају исти датум, али имају различите репрезентације низова. Исечак испод илуструје прву тачку:

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З у погледу временског жига.

Није могуће променити само временску зону постојећег датумског објекта, па је наш циљ сада створити нови датумски објекат, али са УТЦ уместо локалне временске зоне.

Занемарићемо корисникову временску зону и користићемо УТЦ током прављења објекта датума. Постоје два начина за то:

  1. Направите ИСО форматирани низ датума од корисничког датума уноса и користите га за креирање објекта Дате. Коришћење важећег ИСО формата датума за креирање објекта Дате, док је намера УТЦ-а против локалног врло јасна.
new Date ('12/20/1989')

Ово такође функционише ако не наведете време јер ће то подразумевано бити поноћ (тј. 00: 00: 00З):

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

Запамтите: Ако се конструктору датума преда низ у исправном ИСО формату датума ГГГГ-ММ-ДД, аутоматски се претпоставља УТЦ.

  1. ЈаваСцрипт нуди уредну функцију Дате.УТЦ () помоћу које можете добити временску ознаку УТЦ датума. Издвајамо компоненте из датума и прослеђујемо их функцији.
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);

Напомена: Имамо нестандардни формат. Прочитајте АПИ документ да бисте утврдили да ли то значи 12. октобар или 10. децембар Промените ИСО формат у складу с тим.

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) јер се неспецификовани параметри подразумевају на нулу.

На пример, ако користите бирач датума и времена који вам даје датум 2012-10-12 и време 12:30, можете издвојити делове и створити нови објекат Дате на следећи начин:

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(); објект са улазом у важећем ИСО формату датума (ГГГГ-ММ-ДД), подразумевано ће бити УТЦ уместо да подразумевано подешава временску зону прегледача.

Чување датума

Увек сачувајте ДатеТиме у УТЦ. Увек пошаљите ИСО датумски низ или временску ознаку на задњи крај.

Генерације рачунарских програмера схватиле су ову једноставну истину након горких искустава покушавајући да покажу тачно локално време кориснику. Похрањивање локалног времена у позадини је лоша идеја, боље је пустити прегледачу да обрађује претворбу у локално време на предњем крају.

Такође, требало би бити очигледно да никада не бисте требали слати низ ДатеТиме као што је „20. јул 1989. 12:10“ на задњи крај. Чак и ако пошаљете и временску зону, повећавате напор другим програмерима да разумеју ваше намере и правилно анализирају и ускладиште датум.

Користите Date или toISOString() методе објекта Дате за претварање локалног ДатеТиме у УТЦ.

toJSON()

Приказ датума и времена

  1. Набавите временску ознаку или ИСО форматирани датум од РЕСТ АПИ-ја.
  2. Направите 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}, ...) објект.
  3. Користите 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', });

За моју временску зону +05: 45, добијам -345, ово није само супротни знак, већ би број попут -345 могао потпуно збунити позадински програмер. Дакле, претварамо ово у +05: 45.

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() овде, али га и даље складиштимо јер ће нам можда требати у будућности за сврхе отклањања грешака. Заправо бисте могли само послати офсет временске зоне и само УТЦ време. Али и ја волим да чувам локално време, јер ћете на крају морати да сачувате датум у бази података, а одвојено ускладиштено локално време омогућава вам директно упитивање на основу поља, уместо да морате да вршите прорачуне да бисте добили локални датум.

Понекад, чак и када је ускладиштена локална временска зона, пожелећете да прикажете датуме у одређеној временској зони. На пример, времена за догађаје могу имати више смисла у временској зони тренутног корисника ако су виртуелни или у временској зони у којој ће се физички одржати, ако нису. У сваком случају, вреди претходно погледати утврђена решења за форматирање са експлицитним именима временских зона.

Конфигурација сервера и базе података

Увек конфигуришите своје сервере и базе података да користе УТЦ временску зону. (Имајте на уму да су УТЦ и ГМТ није иста ствар —ГМТ, на пример, може подразумевати прелазак на БСТ током лета, док УТЦ то никада неће учинити.)

Већ смо видели колико претварање временске зоне може бити болно, посебно када је нежељено. Увек слање УТЦ ДатеТиме и конфигурисање сервера да буду у УТЦ временској зони може вам олакшати живот. Ваш позадински код биће много једноставнији и чишћи јер не мора да врши конверзије временских зона. ДатеТиме подаци који долазе са сервера широм света могу се упоређивати и сортирати без напора.

који алат би програмер користио за визуелизацију односа између модула

Код на задњем крају треба да буде у стању да претпостави да је временска зона сервера УТЦ (али и даље треба да има на месту проверу да би био сигуран). Једноставна провера конфигурације штеди потребу за размишљањем и кодирањем конверзија сваки пут када се напише нови ДатеТиме код.

Време је за боље руковање датумима

Манипулација датумима је тежак проблем. Концепти иза практичних примера у овом чланку важе изван ЈаваСцрипт-а и само су почетак када је у питању правилно руковање подацима и прорачунима ДатеТиме. Уз то, уз сваку помоћну библиотеку ћете добити свој сет нијанси.

Закључак је: Користите ИСО на задњем крају и оставите предњи да бисте правилно форматирали ствари за корисника. Професионални програмери биће свесни неких нијанси и користиће (утолико одлучније) добро подржане ДатеТиме библиотеке на задњем и предњем крају. Уграђене функције на страни базе података су друга прича, али надамо се да овај чланак даје довољно позадине за доношење мудријих одлука и у том контексту.

Повезан: Бугги ЈаваСцрипт код: 10 најчешћих грешака које ЈаваСцрипт програмери праве

Блоцкцхаин, ИоТ и будућност транспорта: Разумевање Моторо кованица

Бацк-Енд

Блоцкцхаин, ИоТ и будућност транспорта: Разумевање Моторо кованица
Израда јаког пословног случаја са производима

Израда јаког пословног случаја са производима

Процес И Алати

Популар Постс
Како створити бот за анализу расположења е-поште: Водич за НЛП.
Како створити бот за анализу расположења е-поште: Водич за НЛП.
Поуке из инвестиционе стратегије Варрена Буффетта и његове грешке
Поуке из инвестиционе стратегије Варрена Буффетта и његове грешке
Зашто отплата дељења не успева? Неки предложени лекови
Зашто отплата дељења не успева? Неки предложени лекови
Повећајте своју продуктивност помоћу Амазон Веб Сервицес
Повећајте своју продуктивност помоћу Амазон Веб Сервицес
Развој Андроид ТВ-а - Долазе велики екрани, припремите се!
Развој Андроид ТВ-а - Долазе велики екрани, припремите се!
 
Доступност на мрежи: зашто се стандарди В3Ц често игноришу
Доступност на мрежи: зашто се стандарди В3Ц често игноришу
Алати наредбеног ретка за програмере
Алати наредбеног ретка за програмере
Зен девРант-а
Зен девРант-а
Заступства и гаранција: Алат за спајања и преузимања о коме би сваки продавац требао знати
Заступства и гаранција: Алат за спајања и преузимања о коме би сваки продавац требао знати
Значај дизајна усмереног на човека у дизајну производа
Значај дизајна усмереног на човека у дизајну производа
Популар Постс
  • шта се дешава када компанија пријави поглавље 11
  • како направити излог
  • како изградити Распберри Пи
  • Тестирање прототипа мобилне апликације може се обавити ручно или шта?
  • који је један од најчешћих начина на који компанија може смањити снагу добављача
  • шта је доо корпорација
Категорије
  • Агиле Талент
  • Финансијски Процеси
  • Дизајн Бренда
  • Трендови
  • © 2022 | Сва Права Задржана

    portaldacalheta.pt