Leap Seconds for AppDev: Mitä sinun pitäisi tietää (2023)

Julkaistu ensimmäisen kerran TECHNETissä 24. lokakuuta 2018
Kirjailija: Travis Luke

Viime viikolla arvostettu kollegani Dan Cuomo esitteli Leap Seconds -tuen Windows 10:lle, mukaan lukien se, mitä sinun on tiedettävä, jos olet IT-ammattilainen.

Jos olet sovelluskehittäjä, sinun tarvitsemasi asiat ovat hieman erilaisia. Olen varma, että kaikki ihmettelivät, kuinka sovelluksesi hyödyntää "60" sekuntia? Kuinka voit mitata tarkasti ajan ja ajan kestot karkaussekuntien aikana? Ja kuinka aikaa laskevat puitteet ja sovellukset voivat pysyä synkronoituna käyttöjärjestelmän kanssa? Joten tässä artikkelissa yritän selittää kaiken ja kuvata joitain yksityiskohtia ja huomioita, joita tarvitaan karkaussekuntien tukemiseen hakemuksessasi.

Ennen kuin menemme yksityiskohtiin siitä, mitä kehittäjien tulisi harkita, käydään läpi lyhyt historia ajan mittaamisesta ja Leap Secondin syntymästä. Kuten kaikki tiedämme (:)), gregoriaanisessa kalenterissa on tietty standardi ajan mittausvälille.

Suuri poikkeus on karkausvuodet. (Melkein) joka neljäs vuosi helmikuuhun lisätään päivä 366-päiväisen vuoden luomiseksi. Kätevää tässä kaikessa on se, että se on hyvin ennustettavissa. Voimme sanoa varmuudella, kuinka aika lasketaan tulevina vuosina, vuosikymmeninä ja vuosisatoina millisekuntiin asti.

Karkaussekunnit eivät kuitenkaan ole ennustettavissa oleva tapahtuma. Kansainvälinen komitea nimeltä IERS päättää määräajoin lisätä hyppysekunnin maan pyörimishavaintojen perusteella. Kuuden kuukauden välein julkaistaan ​​ilmoitus siitä, lisätäänkö tai vähennetäänkö karkaussekunti vai ei. Tämä ylimääräinen sekunti tapahtuu joko 30. kesäkuutathtai 31. joulukuutast. Tämän tapahtuman ajoitus tapahtuu samaan aikaan kaikkialla maailmassa, kello 23:59:59 UTC.

Jos lisätään sekunti, virallinen kello siirtyy 1000 ms:n askelin välillä 23:59:59 UTC ja 23:59:60 UTC klo 00:00:00 UTC. Jos sekunti vähennetään (mitä ei ole koskaan tapahtunut toistaiseksi), aika siirtyisi 1000 ms:n välein klo 23:59:58 UTC klo 00:00:00.

Kun IERS julkaisee harppauksen toisen tapahtuman, nämä tiedot saapuvat kaikkiin Windows-tietokoneisiin muutaman mekanismin kautta. Se saattaa saada nämä tiedot, kun se synkronoi aikansa a:n kauttaNTPpalvelin. Oletuksena Windows synkronoi NTP-aikalähteen, kuten time.windows.com, kanssa joka päivä. Se voi myös vastaanottaa nämä tiedot Windows Updaten kautta. Kun nämä tiedot saapuvat, ne tallennetaan käyttöjärjestelmään. Tämän ansiosta Windows voi toimia näiden tapahtumien tiedolla.

Windows käyttää rakennetta nimeltäFILETIMEtallentaa aikaleiman. (Jos olet utelias kuten minä, saatat ihmetellä, miksi sitä kutsutaan nimellä filetime. Tämä johtuu siitä, että sitä käytettiin alun perin vain Windowsin tiedostojärjestelmässä edustamaan tiedoston aikaleimaa. Tätä rakennetta käytetään nyt koko käyttöjärjestelmässä kaikille aikaleimoille. liittyvät skenaariot). FILETIME-rakenne edustaa 100 nanosekunnin jaksojen määrää 1. tammikuuta 1601 lähtien. Saatavilla on useita API:ita, jotka voivat muuntaa tämän arvon luettavampaan muotoon. EsimerkiksiFileTimeToSystemTimemuuntaa FILETIMEn SYSTEMTIME-rakenteeksi, joka edustaa kyseisen arvon UTC-aikaa. TheJÄRJESTELMÄN AIKArakenne sisältää vuosi-, kuukausi-, päivä-, tunti-, minuutti- ja sekuntiarvot.

Alkaen Server 2019:stä ja Windows 10:n lokakuun päivityksestäaika API:tottaa nyt huomioon kaikki karkaussekunnit, jotka käyttöjärjestelmä on tietoinen, kun se muuntaa FILETIMEn SystemTimeksi. Tiedostoon FILETIME ei tehdä muutoksia. Se edustaa edelleen 100 ns:n jaksojen määrää aikakauden alusta lähtien. Se, mikä on muuttunut, on tämän luvun tulkinta, kun se muunnetaan muotoon SYSTEMTIME ja takaisin. Tässä on luettelo vaikuttavista sovellusliittymistä:

Aikaisemmin tätä julkaisua SYSTEMTIME:n wSecond-arvot olivat 0–59. SYSTEMTIME on nyt päivitetty sallimaan arvo 60, mikäli vuosi, kuukausi ja päivä edustavat päivää, jolloin karkaussekunti on voimassa.

Tässä on useita usein kysyttyjä kysymyksiä Leap Second Aware -sovellusten kehittämisestä:

Kuinka sovellukset voivat hyödyntää "60" sekuntia?

Jotta prosessi voi vastaanottaa 60 sekuntia SYSTEMTIME-rakenteessa, prosessin on erikseen valittava se. Voit saada prosessisi tekemään tämän soittamallaSetProcessInformationProcessLeapSecondInfo-vaihtoehdolla.
DWORD ErrorCode;
BOOL Menestys;
PROCESS_LEAP_SECOND_INFO LeapSecondInfo;
ZeroMemory(&LeapSecondInfo, sizeof(LeapSecondInfo));
Success = SetProcessInformation(GetCurrentProcess(),
ProcessLeapSecondInfo,
&LeapSecondInfo,
sizeof(LeapSecondInfo));
if (!Menestys) {
ErrorCode = GetLastError();
fprintf(stderr, "Set Leap Second priority epäonnistui: %d\n", ErrorCode);
siivoamaan;
}
Kutsumalla tätä kerrot käyttöjärjestelmälle, että sovelluksesi hyväksyy SYSTEMTIME-rakenteen, jonka arvot ovat välillä 0–60. Sovellusten odotetaan käsittelevän 60-arvoa järkevällä tavalla. Jos sovelluksesi esimerkiksi näyttää tapahtumia luettelossa, jossa on aikaleima, se näyttää aikaleiman arvolla 23:59:60. Tai jos sovelluksesi on analoginen kello, se voi toistaa erityisen animaation, joka ilmaisee karkaussekuntia.

Sovelluskehittäjiä kehotetaan testaamaan sovelluksiaan valitulla prosessilla. Olemme tarjonneet yksinkertaisen menetelmän hyväksytyille käyttäjille ilman koodin uudelleenkääntämistä. Tarkista edellinen blogimerkintämmeKarkaussekunnit IT Prollejossa on osio nimeltä "Sovellusten testaus", joka tarjoaa menetelmän osallistumiseen rekisterin kautta.

Voit myös nähdä esimerkkejä siitä, kuinka lisätä karkaussekunteja itse testaustarkoituksiin w32tm.exe-sovelluksella.

Kuinka sovelluskehittäjät voivat varmistaa, että heidän sovelluksensa on Leap Second -yhteensopiva?

On perusteltua huolestua siitä, että jos SYSTEMTIME-rakenne näyttää Sekuntia-arvon 60, se rikkoisi sovelluksia, jotka eivät ole harppaussekunnin tietoisia. Kuvittele, että sovelluksesi oli analoginen kello. Voidaan olettaa, että sekuntien kelvolliset arvot ovat välillä 0 - 59. Jos se on 60, se voi kaatua yrittäessään laskea kulman sekuntikäteen piirtämiseksi.

Tämän ratkaisemiseksi kaikki prosessit ovat oletusarvoisesti "yhteensopivassa tilassa", elleivät ne nimenomaisesti ota käyttöön "60" sekuntia. Yhteensopivuustilassa toinen arvo on taatusti välillä 0 ja 59. Toisessa ennen karkaussekuntia tai 59 sekunnin kohdalla kello hidastuu puoleen nopeuteen kahdeksi sekunniksi. Tällä on visuaalinen vaikutus, että 59 sekuntia on kaksi kertaa pidempi. Tänä aikana millisekuntien arvot hidastuvat myös ½. Kun tämä 2000 millisekuntia on täynnä, kello jatkaa nostamista normaalilla nopeudella. Tämä antaa sovelluksille harppaussekuntia ja mahdollistaa sen, että kaikki "hidastusjakson" aikana esiintyvät aikaleimat voidaan lajitella oikeaan järjestykseen, jossa ne tapahtuivat. Toistan, että yllä oleva on oletustoiminto yhteensopivuustilassa.

Kuinka voit mitata tarkasti ajan ja ajan kestot karkaussekuntien aikana?

Yksi usein heräävä kysymys on, kuinka mittaat ajan keston? Oletetaan, että haluat lisätä 1 päivän olemassa olevaan aikaleimaan. Tarkoittaako tämä 24 tunnin tai 1 440 minuutin tai 86 400 lisäämistä tiettyyn aikaleimaan? Vai tarkoittaako se 1 päivän lisäämistä riippumatta siitä, kuinka monta sekuntia kyseisellä päivällä on (mukaan lukien mahdolliset karkaussekunnit). Jos haluat lisätä 86 400 sekuntia, voit seurata ohjeitatässä. Tässä tapauksessa otat FILETIME-rakenteen ja siirrät sitä eteenpäin tietyn määrän millisekunteja saadaksesi yhden normaalin päivän ajan.

Toisaalta, jos haluat lisätä yhden päivän sekunneista riippumatta, sinun on käytettävä toista lähestymistapaa. Tässä tapauksessa muutat FILETIMEsi SYSTEMTIME-rakenteeksi käyttämälläFileTimeToSystemTime. Lisää sitten päivien lukumäärä rakenteeseen. Peitä se sitten takaisin tiedostoon FILETIME käyttämälläSystemTimeToFileTimeAPI. Tämän ansiosta käyttöjärjestelmä voi käyttää aritmetiikkaa SYSTEMTIMEn peittämiseksi FILETIMEksi, samalla kun otetaan huomioon kaikki tunnetut karkaussekunnit.

On oltava varovainen, kun FILETIME-arvoja siirretään tietokoneiden välillä. Jos FILETIME-arvo luodaan vanhemmassa Windows-tietokoneessa tai muussa kuin Windows-tietokoneessa, se ei ehkä ota huomioon karkaussekunteja. Jos tämä FILETIME muutettiin sitten PC:llä SYSTEMTIME-rakenteeksi, joka ottaa huomioon karkaussekunnit, aiottu aika saattaa olla pois päältä. Tämän korjaamiseksi on toimitettu rekisteriavain, joka poistaa kaiken harppauksen toisen logiikan käytöstä. Jos asetat tämän rekisteriavaimen, kaikki SYSTEMTIME- ja karkaussekuntiin liittyvät toiminnot palautetaan. Jos välität FILETIME-arvoja heterogeenisessa ympäristössä, voit harkita tämän avaimen asettamista. Löydät tästä lisätietoja kohdastatässäkohdassa "Palaa aikaisempaan käyttöjärjestelmän toimintaan".

Kuinka aikaa laskevat puitteet ja sovellukset voivat pysyä synkronoituna käyttöjärjestelmän kanssa?

Jotkut puitteet ja sovellukset voivat yrittää laskea aikaa käyttämällä omaa aritmetiikkaansa. Esimerkiksi .NET Frameworkin System.DateTime-rakenteessa on logiikka, joka edustaa aikaa. Jos käyttöjärjestelmä ei käsittele ajan laskennan toteutusta, kehys saattaa saapua eri aikaan kuin käyttöjärjestelmä. Kuvittele esimerkiksi, jos soitit DateTime.Now-puheluun kuukauden karkaussekunnin jälkeen. Kehys kutsuisi GetSystemTimeAsFileTimea saadakseen nykyisen hetken FILETIMEn. Se tallentaisi tämän arvon rakenteen sisään. Kun käyttäjä haluaa tietää päivämäärän, hän voi kutsua .ToString()-funktiota. Jos tämä kehys yrittäisi suorittaa oman aritmetiikkansa muuttaakseen tuon ajan vuodeksi, kuukaudeksi, päiväksi, tunniksi, minuutiksi, sekunniksi, eikä se ottaisi huomioon karkaussekuntia, sen palautusaika olisi yhden sekunnin nopeampi kuin aika, jonka käyttöjärjestelmä raportoi. Jokaista järjestelmään lisättyä karkaussekuntia kohden kehys jatkoi ajamista eteenpäin ajassa. Korjatakseen tämän .NET Framework päivitti toteutuksen kutsumaan FileTimeToSystemTime API:ta. Tämä antaa käyttöjärjestelmän kehyksen sijaan ottaa huomioon kaikki karkaussekunnit ja suorittaa oikean aritmeettisen laskun.

Sovellukset, jotka perustuvat 3rdpuoluekehysten tulee varmistaa, että niiden puitteet Windowsissa myös kutsuvat oikeita API:ita oikean ajan laskemiseksi, tai muuten sovellus raportoi väärän ajan.

Tukeeko .NET-kehys karkaussekunteja?

Tätä kirjoitettaessa System.DateTime-rakenne ei ota huomioon karkaussekunteja. Se toimii tehokkaasti yhteensopivuustilassa yllä olevassa osiossa kuvatulla tavalla. Toisin sanoen karkaussekunnin hetkellä '59' sekunti on kaksi kertaa pidempi. Pysy kuulolla päivityksistä, kun .NET Frameworkiin lisätään suurempi harppaussekunnin tuki.

Kuinka voin estää karkaussekuntien esiintymisen?

Olemme käyneet tästä paljon keskustelua. Ajattelemme järjestää päivän kaikille, jotka vastustavat karkaussekuntia juosta länteen. Tämä toivottavasti muuttaa maan pyörimissuuntaa ja poistaa harppaussekunnin tarpeen.

Suosittelemme, että kaikki kehittäjät tekevät sovelluksistaan ​​tietoisia. Kehotamme sinua kokeilemaan tarjoamiamme työkaluja sovellusten testaamiseen ja valitsemaan skenaarioissasi toimivat lähestymistavat. Olemme innokkaita kuulemaan kehitysyhteisöltä heidän kokemuksiaan Leap Secondsista.

Kiitos kun luit,

Travis Luke

References

Top Articles
Latest Posts
Article information

Author: Rev. Porsche Oberbrunner

Last Updated: 15/06/2023

Views: 6411

Rating: 4.2 / 5 (73 voted)

Reviews: 80% of readers found this page helpful

Author information

Name: Rev. Porsche Oberbrunner

Birthday: 1994-06-25

Address: Suite 153 582 Lubowitz Walks, Port Alfredoborough, IN 72879-2838

Phone: +128413562823324

Job: IT Strategist

Hobby: Video gaming, Basketball, Web surfing, Book restoration, Jogging, Shooting, Fishing

Introduction: My name is Rev. Porsche Oberbrunner, I am a zany, graceful, talented, witty, determined, shiny, enchanting person who loves writing and wants to share my knowledge and understanding with you.