Automatyczne rozpoznawanie niepełnych dat

Pierwsze wersje LibreOffice bardzo swobodnie uznawały rozmaite ciągi znaków za daty. Zmieniło się to w wersji 3.6. W tym artykule przyjrzymy się staremu zachowaniu, powodom wprowadzenia zmian oraz spróbujemy odnaleźć się w nowym świecie.

Wcześniejsze wersje LibreOffice (a także wszystkie wersje OpenOffice.org oraz Apache OpenOffice) traktowały jako datę właściwie każdy ciąg znaków, który choćby odrobinę ją przypominał. Wystarczyło wprowadzić do komórki liczby oddzielone kropką, ukośnikiem lub myślnikiem, aby Calc zaprezentował je jako datę.

Chociaż miało to swoje zalety, prowadziło również do wielu niepożądanych efektów. Jeżeli tylko użytkownik zapomniał znaku równa się przed ułamkiem (zapisanym jako np. „3/4”), otrzymywał zamiast niego datę. Liczby skopiowane z anglojęzycznej strony internetowej, na której jako separatora części dziesiętnej użyto kropki, zamieniały się w polskim arkuszu w zbiór niedorzecznych dat. Co więcej, próba przywrócenia pakietu do porządku poprzez zmianę formatu wyświetlania zawartości komórki skutkowała uzyskaniem liczb rzędu kilkudziesięciu tysięcy (ponieważ wewnętrznie data jest przechowywana jako liczba dni od 30 grudnia 1899 roku).

Zachowanie to przez lata budziło irytację wielu użytkowników pakietu.

Powody wprowadzenia zmian

Właśnie z myślą o tych użytkownikach programiści LibreOffice podjęli decyzję o wprowadzeniu pewnych ograniczeń do sposobu rozpoznawania niepełnych dat.

Od wersji 3.6 pakietu jako daty traktowany jest jedynie ciąg rok-miesiąc-dzień, czyli trzy liczby oddzielone myślnikami (format ISO 8601).

Prócz tego dla wielu języków wygenerowano wzorce skrótowych sposobów zapisywania dat. Dla przykładu, w języku czeskim (podobnie jak w polskim), zapis 13.02 oznacza trzynasty lutego bieżącego roku; w czeskiej wersji pakietu wartość komórki „13.02” zostanie poprawnie rozpoznana jako data.

Nowe problemy

Wprowadzona zmiana spowodowała jeden dość istotny problem — w niektórych językach niemożliwe stało się szybkie wpisywanie dat za pomocą klawiatury numerycznej. We wspomnianym języku czeskim (ponownie: tak jak w polskim) separatorem liczb dziesiętnych jest przecinek, a nie kropka. W rezultacie użytkownicy prawą ręką mogą wpisać „13,02”, „13/02” oraz „13-02”, ale nie „13.02”; tymczasem tylko ten ostatni zapis pasuje do wzorca i zostanie potraktowany jako data.

Tworzenie i modyfikowanie wzorców dat

Aby rozwiązać ten problem, wprowadzono możliwość samodzielnego tworzenia wzorców dat. Odpowiednie pole zatytułowane jest Akceptowane wzorce dat i znajduje się w NarzędziaOpcje...Ustawienia językoweJęzyki.

Każdy wzorzec musi składać się z przynajmniej dwóch znaków — symbolu zastępczego fragmentu daty oraz separatora.

Dostępne są trzy symbole zastępcze: D (dzień), M (miesiąc) oraz Y (rok).

Separatorem może być praktycznie dowolny znak, za wyjątkiem średnika (;), wielkich liter D, M i Y oraz małych liter alfabetu. W ramach jednego wzorca nie trzeba się ograniczać do konkretnego symbolu separatora — np. D-M/Y jest wzorcem w zupełności poprawnym, chociaż raczej trudnym do zapamiętania.

Poszczególne wzorce w polu oddzielamy od siebie średnikami.

Jak to działa?

Podczas edycji arkusza kalkulacyjnego LibreOffice sprawdzi, czy wprowadzona do komórki wartość odpowiada któremuś z wcześniej określonych wzorców (czyli czy wprowadzone zostały liczby oddzielone odpowiednimi separatorami). Jeżeli tak, potraktuje ją jako datę i automatycznie uzupełni o brakujące wartości. Jeżeli nie, spróbuje ją dopasować do innych formatów komórek (waluta, procent itd.), a jeżeli i to się nie powiedzie, ostatecznie uzna za zwykłą liczbę lub tekst.

Przyjrzyjmy się temu na przykładzie.

Załóżmy, że dodaliśmy wzorzec daty D/M. Do komórki wpisujemy 13/2. Po zakończeniu jej edycji, zostanie ona wypełniona ciągiem 13.02.2013, czyli datą zapisaną zgodnie z polskimi zasadami.

Jeżeli nasz wzorzec zawiera symbol Y, wpisane w jego miejsce liczby dwucyfrowe rozpoznawane są zgodnie z ustawieniami w NarzędziaOpcje...LibreOfficeOgólne; nie ma więc konieczności każdorazowego wpisywania czterocyfrowej liczby.

Podobał Ci się ten artykuł? Zapisz się na listę subskrybentów i otrzymuj informacje o następnych

komentarzy 14

  • Piotr napisał(a):

    Dzięki!!! – to jeden z problemów, które doskwierały mi po przesiadce z OO na LO… ale i tak mam jeszcze gorsze. Dopiero znalazłem tego bloga, więc może wygrzebię tutaj i na nie odpowiedź. 🙂 Np. nie mam kolorów tekstu w Calcu (przykładowo wartości ujemne mam na czarno pomimo [RED] w ustawieniach stylu)

    • Mirosław Zalewski napisał(a):

      Cieszę się, że artykuł się przydał 🙂 . Mam nadzieję że pozostałe również okażą się pomocne.
      Jeżeli zaś chodzi o kolorowanie liczb ujemnych — u mnie na LO 3.6.5 działa to poprawnie. Zadaj proszę pytanie na forum polskiej społeczności, gdzie masz większą szansę szybko otrzymać poprawną podpowiedź.

  • Sebastian napisał(a):

    LO 4.0.3.3
    NIE DZIAŁA.
    Po wpisaniu swojego kodu na D/M/YY
    ciągle przelicza na rok 1900
    Jak spowodować abym mógł wpisywać datę 11 stycznia 2011 roku:
    1. 11/1/11
    2. 11,1,11

    w pierwszym przypadku separatorem jest / (slash) a w drugim , (przecinek).
    Nie mam zamiaru wpisywać dat lewą i prawą ręką a tylko prawą na klawiaturze alfanumerycznej.
    Jak spowodować też wyświetlanie tej daty np. 11/01/2011 po wpisaniu jednego i drugiego ciągu znaków.
    Mi ciągle przelicza na rok 1900 albo zostawia jako zwykły tekst!

    • Mirosław Zalewski napisał(a):

      Przed butnym stwierdzeniem, że coś nie działa (a więc pośrednim oskarżeniem programistów o to, że źle wykonują swoją pracę), warto mieć pewność, że wszystko robi się dobrze.
      Ten wzorzec nie jest poprawny. LO nawet o tym informuje, zmieniając kolor tekstu w polu na czerwony.
      Poprawny wzorzec to D/M/Y

  • Sebastian napisał(a):

    Bardzo urażonego programistę przepraszam bardzo ale sprawdziłem wcześniej kilka razy różne wersje!:)
    http://prntscr.com/181j9n

    • Mirosław Zalewski napisał(a):

      Artykuł dotyczy wzorców dat, określanych w Narzędzia → Opcje… → Ustawienia językowe → Języki → Akceptowane wzorce dat.
      Zrzut ekranu pokazuje okno formatowania zawartości komórki. To zupełnie inna para kaloszy.
      Podczas wprowadzania zawartości komórki LO sprawdza, czy pasuje ona do wzorca. Jeżeli tak, to przetwarza ją na liczbę (daty są wewnętrznie przechowywane jako liczby). Następnie tę liczbę wyświetla jako datę zgodnie z ustawieniami formatowania komórki.
      Format komórki dopuszcza inny zestaw znaczników niż wzorzec daty. Np. pojedyncze Y ma sens we wzorcu daty, ale nie ma znaczenia w formacie komórki (więc jest traktowane po prostu jako litera Y, co widać na zrzucie).

  • Sebastian napisał(a):

    zakręcone to jak świński ogon!
    Generalnie nie potrafię zrobić tak jak pisałem wyżej. Wiesz może jak to rozwiązać i w ogóle dlaczego to jest takie trudne?
    chciałem tylko zmienić separator daty a tu takie mecyje!

    • Mirosław Zalewski napisał(a):

      Jeżeli chcesz zmienić separator daty (to, co się wyświetla w komórce), tak jak piszesz teraz, to zmień format komórki.
      Jeżeli chcesz wpisywać daty prawą ręką za pomocą klawiatury numerycznej, tak jak pisałeś we wcześniejszym komentarzu, zmień akceptowany wzorzec zgodnie z instrukcjami podanymi w artykule, pod którym rozmawiamy.
      A trudne ani zakręcone wcale nie jest. Mamy jedynie separację trzech warstw — wejścia (tego, co wpisujesz), przetrzymywania oraz wyjścia (tego, co widać). I dzięki temu możesz wpisać „11/1/12”, a w komórce pojawi się „11.01.2012” — czyli data zgodna z polskimi regułami.

      • Sebastian napisał(a):

        Nie mogę, nie wiem jak. Piszesz „możesz wpisać”, tak, mogę ale data pojawia się taka jak screenshocie. A dlaczego nie możesz mi powiedzieć po prostu CO mam wpisać? W formatowaniu bezpośrednim wpisuje różne wersje – „D/M”, „D/M/Y”, „D/M/YY” i nic to nie daje. Data ciągle jest 1900. moja data to 11/1/11. Jak zrobić i gdzie wpisać aby wyświetlała się data 11/1/11 albo jak dodam 2xM to 11/01/11 ? a jak 4xY to 11/01/2011 ? ciągle jest 1900! Trudne to jest bo nie nie wychodzi!

        • Mirosław Zalewski napisał(a):

          Gdybyś nie zauważył, to już napisałem co (mój pierwszy komentarz) i gdzie (mój drugi komentarz) masz wpisać.
          Jeszcze raz, od początku.
          Wybierasz z menu do Narzędzia → Opcje…. Przechodzisz do Ustawienia językowe → Języki. W polu „Akceptowane wzorce dat” dopisujesz średnik a po nim wzorzec D/M/Y. Zatwierdzasz zmiany.
          W komórce arkusza wpisujesz „11/1/11”. Zostaje ona rozpoznana jako data i wyświetlona jako „11.01.2011”.
          Jeżeli chcesz, żeby się wyświetlała inaczej, to klikasz prawym → Formatuj komórki… Ustawiasz kod formatu zgodnie z tabelą.

          To jest mój ostatni komentarz w tej sprawie. Nie mam obowiązku nikomu pomagać na blogu. Jeżeli dalej masz z czymś problem lub czegoś nie wiesz, zapytaj na forum polskiej społeczności.

  • Sebastian napisał(a):

    Dziękuje bardzo.
    (musiałem > SKOMPLIKOWANE to jest 🙂

    • Sebastian napisał(a):

      Musze jednak szukać pomocy na forum. nie działa to co podałeś! PZDR

  • Mikołaj napisał(a):

    POMOCY!!!!
    Chcę aby moją datę wyświetlało jako DD.MM.YY
    – ciągle zmienia się na D.MM.YYYY przez co nie mogę znaleźć żadnej daty.
    Nic nie pomaga 🙁 jak to zrobić ?

  • Mikołaj napisał(a):

    To znowu ja. Formatowanie komórki nie pomaga, data zmienia się spowrotem na D.MM.YYYY
    W tej wiadomości poprawiłem też email ::)