CalCalcs i udunits biblioteki

24 May 12:36 pm


Original: http://meteora.ucsd.edu/~pierce/calcalcs/udunits.html

Udunits biblioteka jest poręczny zestaw procedur wymiany informacji pomiędzy różnymi jednostkami. Także w wersji 1 biblioteki były pewne procedury do obsługi daty i godziny. W szczególności, rutynowe utCalendar można przekształcić czasowe odstępy w dniach, na przykład, konwersji “3 dni od 01.1.1901” w dniu “04/01/1901”. Rutynowe utInvCalendar nie odwrotnej transformacji, na przykład, konwersji datę “04.01.1901” do “3 dni od dnia 01.01.1901”. Można określić datę konwersje zostały odniesione do i przedział czasu, więc można było tak łatwo pracować w “milisekund od 15.09.1875 12:00” i wielu innych jednostek.

Udunits biblioteki jest szeroko stosowany w dziedzinie badań klimatycznych, więc napisałem utCalendar_cal i utInvCalendar_cal, która rozszerzyła te procedury do obsługi kalendarzy zazwyczaj wykorzystywane przez modele klimatyczne.


Wersja 2 udunits bibliotece

W przypadku wersji 2 udunits biblioteki została wydana nowa API nie obejmują bezpośredni zamiennik utCalendar / utInvCalendar funkcjonalności. Dodatkowo, dokumentacja do wersji 2 biblioteki stanowi:

“Doszedłem do wierzą jednak, że stworzenie takiej jednostki [jednostka odniesienia kalendarzowego Data] był błąd, przede wszystkim dlatego, użytkownicy próbują korzystać z urządzenia w sposób, na który nie został zaprojektowany (takie jak daty konwersji w kalendarz, którego rok wynosi dokładnie 365 dni długo). Działania te są znacznie lepiej obsługiwane przez dedykowanego pakietu kalendarzowego. Proszę być ostrożnym przy użyciu znacznika czasu-jednostek. ”

W kodzie źródłowym sama, rutynowe unitcore.c, komentarz na temat odnośnych państw kalendarz-jednostkowych Data:

“Błędna jednostka, która nie powinna istnieć, ale nie dla kompatybilności wstecznej. To miał zapewnić podobną funkcjonalność jak GalileanUnit, ale dla jednostek czasu (np.” sekund od początku epoki “). Niestety, ludzie starają się go użyć więcej, niż jest w stanie (np. dzień od jakiegoś czasu na wyimaginowanego świata z tylko 360 dni w roku). ”

CalCalcs procedury

Powyżej mnie obawy, że wsparcie dla calendrical obliczeń może być usunięty w przyszłej wersji. A ponieważ byłem przepisanie utCalendar_cal i utInvCalendar_cal procedury wspierania udunits wersji biblioteki 2 tak, pomyślałem, że równie dobrze mogę wymienić wszystkie funkcje kalendarzowego udunits biblioteki.

Oto jak ja skonstruowany to.

Procedury CalCalcs sami pracować tylko w całkowitych dni, i nie używają kodu lub połączenia do udunits libray (zarówno w wersji 1 lub 2). Są one całkowicie autonomiczne. Są w ich archiwum (“calcalcs.c”) i mają swój własny nagłówek (“calcalcs.h”), i może być skompilowany bez powiązania z udunits biblioteki.

Nowe procedury utCalendar2_cal i utInvCalendar2 zarówno 1) zapewnienia zastępstwa dla starej wersji 1 procedury, które działają z wersją 2 biblioteki, 2) przedłużyć te nowe procedury do kalendarzy używanych przez modele klimatyczne. Procedury te należy udunits bibliotekę tylko do dwóch rzeczy: analizowania ciąg jednostek i konwersji między jednostek czasu (np. dzień na sekunda lub sekund do godziny). Nie używać żadnych udunits procedury zaproszeń do wszelkich calendrical obliczeń. Są one w oddzielnym pliku źródłowym i nagłówka (“utCalendar2_cal.c” i “utCalendar2_cal.h”). Jeśli używasz utCalendar2_cal.c należy także calcalcs.c i połączyć wynik z udunits biblioteki.

Jak udunits biblioteka zachowuje

Ponieważ utCalendar2_cal i utInvCalendar2_cal używać udunits biblioteki analizować ciąg jednostek, dziedziczą niektóre zachowania z udunits-2 biblioteki. Jeśli nie są świadomi tego zachowania, może czasami być zaskoczeni tym, jak to działa.

Po pierwsze, udunits cicho i nieunikniony przekształca wszelkie odniesienia do “0 roku” w roku 1. Więc jeśli używasz utCalendar2_cal/utInvCalendar2_cal rutyny, w każdej chwili można przejść odniesienie do roku 0 w ciągu jednostek – na przykład przez określenie “dni od 0000-01-01” – będzie to dokładnie tak, jak gdybyś określono “dni od 0001-01-01”. Jest to prawdą nawet jeśli podasz kalendarza noleap lub 360_day. Moja najlepsza rada jest, aby nigdy nie używać “rok 0” jako rok odniesienia w udunits ciąg.

Po drugie, udunits-2 biblioteki nie w pełni sprawdzić swoje wejście na ważności, dzięki czemu można na przykład określić “dni od 2001-89-01”, i to szczęśliwie wziąć. Wynik będzie tak, jakby minęło “dni od 2001-08-01”.

Albo wziąć sprawy dni, które nie istnieją w standardowym kalendarzu. Na przykład kalendarz przesiedli się z kalendarza juliańskiego, który był używany do 04 października 1582, w kalendarzu gregoriańskim, rozpoczynając następny dzień, który został oznaczony 15 października 1582. Więc co się dzieje, jeśli określić ciąg jednostek “dni od 05.10.1582”? Udunits biblioteka traktuje go tak, jakby został określony “15.10.1582”. Innym przykładem jest dzień skok w nie-przestępne lata – ciąg “dni od 29.02.1901” (tj. dzień przestępny określony dla non-przestępnym roku) jest traktowany jako 01/03/1901. Prawdopodobnie nie jest nieuzasadnione, ale może się okazać, że nieoczekiwane, że “dni od 31.02.1901” jest traktowany jako “dzień od 03.03.1901”, a “dzień od 1901-02-32” jest traktowany jako “dzień od 1901 roku -02-03 “.

Jeśli chcesz uniknąć tych zachowań, można przepisać aplikację do korzystania z CalCalcs procedur bezpośrednio (zamiast polegać na utCalendar2_cal/utInvCalendar2_cal interfejsu i dlatego w udunits jednostek kodu parsowania smyczkową), ponieważ procedury CalCalcs obsługi tych sytuacji prawidłowo.

Comments are closed