JavaScript property :: lastModified

Když jsem začal psát své stránky (podotýkám, že je opravdu píši - tj. nepoužívám žádný generátor stránek - od toho mne odradil pohled na "source" dokumentu několikrát opravovaného nějakým generátorem), rozhodl jsem se použít vlastnost JavaScriptu - last Modified. Zdálo se mi, že je to ideální prostředek, jak zjistit, kdy byla ta která stránka naposledy opravena.

Na štěstí jsen se rozhodl stránky ještě "verzovat" - což ovšem dělám ručně a sem-tam na to zapomenu.

Po několikaletém provozu svých web-stránek jsem však zjistil, že používání vlastnosti lastModified je většinou spíš ke škodě než k užitku:
   a) ftp programy a file-mamagery při uploadování mění datum uploadovaného dokumentu,
   b) některé web-servery nepodporují tuto vlastnost,
   c) různé prohlížeče používají různé formáty data; v případě, že web-server neposílá tuto hodnotu, často používají aktuálmí čas počítače

Proto jsem se rozhodl všechny své stránky postupně opravit tak, že datum poslední modifikace budu vkládat ručně ve formátu:
   - anglický název měsíce
   - dvojmístné pořadové číslo dne v měsícist/nd/th
   - čtyřmístné číslo roku
   - hh:mm
   - rozdíl od UTC ve tvaru (UTC+hh:mm)
   - např.: March 11th, 2004 20:40:00 (UTC + 01:00)

Více k problematice lastModified viz
    http://www.merlyn.demon.co.uk , zvláště pak
    http://www.merlyn.demon.co.uk/js-date3.htm a
    http://www.merlyn.demon.co.uk/last-mod.htm

Dále se problematikou GMT (Greenwich Mean Time) a UTC (atomic clock time) zabývají tyto stránky:
    http://www.dxing.com/utcgmt.htm ,
    http://wwp.greenwichmeantime.com/home.htm a
    http://www.worldtimezone.com

Přehledná tabulka používaných časů je např. na :
    http://www.timeanddate.com/library/abbreviations/timezones/index.html

Abych si usnadnil práci a nezapomněl na vložení data poslední změny dokumentu, napsal jsem jednoduchy batch-file, který vždy spustím po jakékoliv opravě.
Nelíbilo se mi generování pracovního scriptu, ale problémy s použitím (volatile) proměnných nastavených pomocí wsh (vbs) scriptů (nemožnost použít takto nastavenou proměnnou v otevřeném okně příkazového řádku) mě donutily se této zásady vzdát.
Jedná se o sekvenci příkazů cmd.exe a programu "reg.exe" ver.: 3.0, který je součástí instalace Windows XP. Dále je použit cygwinový (freeware) program sed. Tento batch-file funguje bez problémů v systému Windows XP Pro cz. V jiných systémech jsem jej nezkoušel. Pro jinou (nečeskou) lokalizaci by bylo pravděpodobně nutno upravit nastavení proměnných použitých pro datum a čas.

DATHTML.bat:

@    ECHO OFF
     SETLOCAL

     ECHO.%*|FIND "?">nul
     IF NOT ERRORLEVEL 1               SET ERR=0
     FOR /F "TOKENS=2,3*" %%A IN ('ver') DO SET OS=%%A_%%B
     IF NOT "%OS%"=="Windows_XP" IF NOT "%OS%"=="Windows_2000" SET ERR=1&&GOTO E00
     sed.exe --help>nul 2>&1
     IF     ERRORLEVEL 1               SET ERR=2&&GOTO E00
     IF     "%1"==""                   SET ERR=3&&GOTO E00
     IF NOT EXIST %1  IF NOT EXIST ~%1 SET ERR=4&&GOTO E00
     IF NOT EXIST ~%1 FINDSTR /C:"MY_DATUM" %1>nul
     IF     ERRORLEVEL 1               SET ERR=5&&GOTO E00
     if     EXIST ~%1 FINDSTR /C:"MY_DATUM" ~%1>nul
     IF     ERRORLEVEL 1               SET ERR=5&&GOTO E00
     IF NOT EXIST ~%1 REN %1 ~%1&&ECHO.&&ECHO  Soubor "%1" byl prejmenovan na "~%1"&&ECHO.

     FOR /F "TOKENS=1,2,3,4 DELIMS=. " %%A IN ('DATE /T') DO ( SET DAY=%%B
                                                               SET MONTH=%%C
                                                               SET YEAR=%%D
                                                             )

     FOR /F "TOKENS=1,2 DELIMS=:"      %%A IN ('time /T') DO ( SET HOUR=%%A
                                                               SET MINUTE=%%B
                                                             )

     FOR  /F "TOKENS=1,2,3 SKIP=1"     %%A IN ('REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\ControlSET001\Control\TimeZoneInformation" /v ActiveTimeBias') DO SET BIAS=%%C

     SET  /A BIAS=%BIAS%

     IF "%DAY:~0,1%"==" " SET DAY:~0,1=0
     IF "%DAY:~1,1%"=="1" SET SFFX=st&&GOTO L01
     IF "%DAY:~1,1%"=="2" SET SFFX=nd&&GOTO L01
     IF "%DAY:~1,1%"=="3" SET SFFX=rd&&GOTO L01
     SET SFFX=th

:L01
     IF "%MONTH%"=="01" SET MONTH=January&&GOTO   L02
     IF "%MONTH%"=="02" SET MONTH=February&&GOTO  L02
     IF "%MONTH%"=="03" SET MONTH=March&&GOTO     L02
     IF "%MONTH%"=="04" SET MONTH=April&&GOTO     L02
     IF "%MONTH%"=="05" SET MONTH=May&&GOTO       L02
     IF "%MONTH%"=="06" SET MONTH=June&&GOTO      L02
     IF "%MONTH%"=="07" SET MONTH=July&&GOTO      L02
     IF "%MONTH%"=="08" SET MONTH=August&&GOTO    L02
     IF "%MONTH%"=="09" SET MONTH=September&&GOTO L02
     IF "%MONTH%"=="10" SET MONTH=October&&GOTO   L02
     IF "%MONTH%"=="11" SET MONTH=November&&GOTO  L02
     IF "%MONTH%"=="12" SET MONTH=December&&GOTO  L02

:L02
     IF "%BIAS%"=="-60"    SET TZ=UTC + 01:00&&GOTO L03
     IF "%BIAS%"=="-120"   SET TZ=UTC + 02:00&&GOTO L03
     IF "%BIAS%"=="-180"   SET TZ=UTC + 03:00&&GOTO L03
     IF "%BIAS%"=="-240"   SET TZ=UTC + 04:00&&GOTO L03
     IF "%BIAS%"=="-300"   SET TZ=UTC + 05:00&&GOTO L03
     IF "%BIAS%"=="-360"   SET TZ=UTC + 06:00&&GOTO L03
     IF "%BIAS%"=="-420"   SET TZ=UTC + 07:00&&GOTO L03
     IF "%BIAS%"=="-480"   SET TZ=UTC + 08:00&&GOTO L03
     IF "%BIAS%"=="-560"   SET TZ=UTC + 09:00&&GOTO L03
     IF "%BIAS%"=="-600"   SET TZ=UTC + 10:00&&GOTO L03
     IF "%BIAS%"=="-660"   SET TZ=UTC + 11:00&&GOTO L03
     IF "%BIAS%"=="-720"   SET TZ=UTC + 12:00&&GOTO L03

     IF "%BIAS%"=="+60"    SET TZ=UTC - 01:00&&GOTO L03
     IF "%BIAS%"=="+120"   SET TZ=UTC - 02:00&&GOTO L03
     IF "%BIAS%"=="+180"   SET TZ=UTC - 03:00&&GOTO L03
     IF "%BIAS%"=="+240"   SET TZ=UTC - 04:00&&GOTO L03
     IF "%BIAS%"=="+300"   SET TZ=UTC - 05:00&&GOTO L03
     IF "%BIAS%"=="+360"   SET TZ=UTC - 06:00&&GOTO L03
     IF "%BIAS%"=="+420"   SET TZ=UTC - 07:00&&GOTO L03
     IF "%BIAS%"=="+480"   SET TZ=UTC - 08:00&&GOTO L03
     IF "%BIAS%"=="+560"   SET TZ=UTC - 09:00&&GOTO L03
     IF "%BIAS%"=="+600"   SET TZ=UTC - 10:00&&GOTO L03
     IF "%BIAS%"=="+660"   SET TZ=UTC - 11:00&&GOTO L03
     IF "%BIAS%"=="+720"   SET TZ=UTC - 12:00&&GOTO L03

:L03
     SET DATUM1=%MONTH% %DAY%
     SET DATUM2= %YEAR%, %HOUR%:%MINUTE% (%TZ%)
     sed.exe -e "s/MY_DATUM/%DATUM1%<SUP>%SFFX%<\/SUP> %DATUM2%/g" "~%1">%1
     GOTO END

:E00
::   CLS
     ECHO.
     ECHO  ========================================================================
     ECHO   Batchfile:  DATHTML.bat
     ECHO   Version:    5.0
     ECHO   Written:    30.03.2004
     ECHO   Updated:    -
     ECHO   Author:     Jiri Libal sr.
     ECHO  ------------------------------------------------------------------------
     ECHO   Purpose:    nastaveni hodnoty "Last-updated" v souborech "*.html"
     ECHO   OS:         Windows XP PRO cz
     ECHO   Parameters: nazev souboru "file_name"
     ECHO  ------------------------------------------------------------------------
     ECHO       Programs used:   sed.exe              (http://www.cygwin.com)
     ECHO       Variables used:  DATUM1
     ECHO                        DATUM2
     ECHO                        DAY
     ECHO                        MONTH
     ECHO                        YEAR
     ECHO                        HOUR
     ECHO                        MINUTE
     ECHO                        BIAS
     ECHO                        TZ
     ECHO                        SFFX
     ECHO      Generated files: _filename                      (If not exists)
     ECHO  ------------------------------------------------------------------------
     ECHO   Example of using:   DATHTML my.html
     ECHO  ------------------------------------------------------------------------
     ECHO   For timezones see for ex.:
     ECHO         http://www.timeanddate.com/library/abbreviations/timezones/
     ECHO  ========================================================================
     GOTO E0%ERR%

:E01
     ECHO.
     ECHO  ========================================================================
     ECHO   !!! Batch-file funguje jen v OS "Windows XP" !!!
     ECHO  ========================================================================
     ECHO.
     GOTO :END

:E02
     ECHO.
     ECHO  ========================================================================
     ECHO   !!! Program "sed.exe" neni nainstalovan nebo k nemu neexistuje cesta!!!
     ECHO  ========================================================================
     ECHO.
     GOTO :END

:E03
     ECHO.
     ECHO  ========================================================================
     ECHO   !!! Je nutno zadat parametr %%1 (jmeno souboru, napr: "my.html") !!!
     ECHO  ========================================================================
     ECHO.
     GOTO :END

:E04
     ECHO.
     ECHO  ========================================================================
     ECHO   !!! Soubor "%1" ani "~%1" v aktualnim adresari neexistuje !!!
     ECHO  ========================================================================
     ECHO.
     GOTO :END

:E05
     ECHO.
     ECHO  ========================================================================
     ECHO   !!! Soubor "%1" ("~%1") Neobsahuje hledany retezec (MY_DATUM) !!!
     ECHO  ========================================================================
     ECHO.
     GOTO :END

:END
     ENDLOCAL
 REM ========================================================================

Cygwinový program sed.exe je možno získat jako freeware přímo z oficiálních stránek cygwinu. Pro jehoho správnou funkci jej stačí nakopírovat spolu s knihovnou cygwin1.dll do jakéhokolov adresáře, který je uveden v proměnné %PATH%.

 
 
===============================divider===============================
Version: 3.5 Last updated: April 20th 2004, 17:28 (UTC + 02:00) Author: Jiří Líbal sr.