use Win32::OLE;
$Win32::OLE::Warn = 3;

print 'Aktualny czas: ' . VBS::Now(), "\n";

$strCommand = 'cmd.exe /c time 23:02:00';
$objWshShell = Win32::OLE->new('WScript.Shell');
$intRC = $objWshShell->Run($strCommand, 0, 1);
if ($intRC != 0) {
    print 'Bd zwrcony przez polecenie time: ' . $intRC, "\n";
}
else {
    print "Dziaanie polecenia time zakoczone powodzeniem.\n";
}

$strCommand = 'cmd.exe /c date 11/01/2004';
$intRC = $objWshShell->Run($strCommand, 0, 1);
if ($intRC != 0) {
    print 'Bd zwrcony przez polecenie date: ' . $intRC, "\n";
}
else {
    print "Dziaanie polecenia date zakoczone powodzeniem.\n";
}

print 'Nowy czas: ' . VBS::Now(), "\n";

package VBS;
use strict;

use Win32::OLE::NLS qw(:TIME
                       :DATE
                       GetLocaleInfo GetUserDefaultLCID
                       LOCALE_SMONTHNAME1 LOCALE_SABBREVMONTHNAME1
                       LOCALE_SDAYNAME1 LOCALE_SABBREVDAYNAME1
                       LOCALE_IFIRSTDAYOFWEEK
                       LOCALE_SDATE LOCALE_IDATE
                       LOCALE_SGROUPING
                       );
use Win32::OLE::Variant;

use constant EPOCH       => 25569;
use constant SEC_PER_DAY => 86400;

our $lcid;
BEGIN {
    $lcid = GetUserDefaultLCID();
    Win32::OLE->Option(LCID => $lcid);
}

# Zwraca czas lokalny wyraony w sekundach (poczwszy od wartoci staej EPOCH)
sub _localtime_in_sec {
    require Time::Local;
    return 2.0 * CORE::time() - Time::Local::timelocal(gmtime);
}

# Wyodrbnianie okrelonych informacji z daty
sub _extract_from_date {
    my($date,$method,$format) = @_;
    return unless $date;
    unless (UNIVERSAL::isa($date, "Win32::OLE::Variant")) {
        $date = Variant(VT_DATE, $date);
    }
    return $date->$method($format, $lcid);
}

# Zwraca aktualn dat i czas przy uyciu formatu zdefiniowanego w
# systemie komputera.
sub Now {
    return Variant(VT_DATE, EPOCH + _localtime_in_sec()/SEC_PER_DAY);
}

