Aus Datum Millisekunden ermitteln ohne Zeitzonen-Berücksichtigung

Lenz

Mitglied
Hi, über Calendar kann ich von einem Datum die getTimeInMillis() ermitteln. Jedoch wird dabei die Zeitzone berücksichtigt, was ich nicht möchte. Wie kann ich aus einem vorhandenem Datum (Jahr, Monat, Tag) die Millisekunden seit 1.1.1970 ermitteln, ohne Berücksichtigung der Zeitzone? Wie sehen die Codezeilen dafür aus? Danke im Voraus. LG.
 
Hi, System.currentTimeMillis() ist doch die aktuelle Systemzeit des Computers, oder? Ich würde jedoch von einem X-beliebigen Datum den Long-Wert in Millisekunden benötigen. Bisher habe ich das über Calendar ausgewertet, mit 2 Stunden Zugabe (1 h Zeitverschiebung + 1 h Sommerzeit):

Java:
import java.util.Calendar;

//  ...
    Calendar pday = Calendar.getInstance();
    pday.set( 2010 , 7-1 , 16 , 2 , 0 );

    long x = pday.getTimeInMillis();
//  ...
Aber die Zeitzone und die Sommerzeit können sich ändern, und somit kommt bei 2 Stunden Zugabe nicht immer das richtige Ergebnis heraus. Lässt sich das nicht anders lösen?
 
Der 1.1.1970 hat nicht überall auf der Welt gleichzeitig begonnen sondern auch nur Zeitzone für Zeitzone.
Somit sind jetzt gerade in NewYork weniger Milliksekunden seit diesem Tag vergangen als bei uns.

Daher verstehe ich nicht genau wie du die Zeitzone nicht berücksichtigen willst? Ansonsten kannst du bei einem Calendar Objekt die Zeitzone auch festlegen.
Es wäre natürlich interessant etwas mehr über dein Ziel bzw. den Kontext zu erfahren, vielleicht kann man dir dann besser helfen.
 
Der 1.1.1970 hat nicht überall auf der Welt gleichzeitig begonnen sondern auch nur Zeitzone für Zeitzone.
Somit sind jetzt gerade in NewYork weniger Milliksekunden seit diesem Tag vergangen als bei uns.
Das ist zwar im Prinzip richtig, aber Benutzer Lenz will vmtl. die Millisekunden seit der "UNIX EPOCHE", also 1970-01-01T00:00:00 UTC+00:00 ; und das ist eindeutig. (Zumindest so ziemlich, siehe Wikipedia:Unixzeit.)

Auf jeden Fall wird's eine echte Herausforderung, tatsächlich für jedes beliebige Datum (ich bin mal so frei und schränke das zumindest mal auf den Gregorianischen Kalender ab 1582 ein) tatsächlich selbst die vergangene Zeit in Millisekunden zu berechnen. An Schaltjahre, nicht-schalt-Jahrhunderte und doch-schalt-Jahr400e denkt man ggf. noch, Schaltsekunden sind den meisten schon unbekannt.

Ich müsste mal nachsehen, ob dem Programmierer das nicht von java.util.Calendar abgenommen werden kann - so einen Sch**ß baut man ungern selber...

Calendar.getInstance( ... ) kann man als Parameter die Locale mitgeben, da ist dann die aktuelle Zeitzone+(ja/nein)Sommerzeit schon "mit drin"; auch eine (abweichende) Zeitzone ist als Parameter möglich...
 
Zuletzt bearbeitet:
Hört sich für mich so an, als müsstest du lediglich die Timezone richtig auswählen..


Java:
Calendar pday = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
 
Besten Dank an alle, insbesondere an @arilou und @stg. :toll:
Die Tipps zur Timezone und "GMT" haben geholfen (Siehe Zeile 22 im Code).

Java:
// Dieser Code für die BeanShell-Filterkomponente im TV-Browser filtert alle Sendungen, welche
// • ganz oder teilweise im angegebenen 3-Stunden-Zeitbereich laufen,
// • unabhängig vom Datum (also für jeden Tag).
// Getestet bei folgender Software-Einstellung:
// • TV-Browser-Sendungstag dauert von 6:00 bis 6:00 Uhr
// • Systemzeit ist MEZ-Zeit (= UTC-Zeit + 1 Stunde) sowie Sommerzeit (+ 1 Stunde)
// Code-Hinweise:
// • Liegt die Systemzeit zwischen 0:00 und 3:59 Uhr, dann werden 24 Stunden dazugerechnet.

import devplugin.beanshell.BeanShellProgramFilterIf ;
import devplugin.Plugin ;
import devplugin.Program ;
import devplugin.ProgramFieldType ;
import java.util.Calendar ;

accept( Program p )
{
    long acceptablePreTimeMinutes = 0 ;        // Minuten vor der Systemzeit bzw. Filter-Zeitbereich-Beginn
    long acceptablePostTimeMinutes = 180 ;     // Minuten nach der Systemzeit bzw. Filter-Zeitbereich-Ende

    Calendar programdate = Calendar.getInstance() ;
    programdate.setTimeZone( TimeZone.getTimeZone( "GMT" ) ) ;
    programdate.set( Plugin.getPluginManager().getCurrentDate().getYear() ,
                     Plugin.getPluginManager().getCurrentDate().getMonth() - 1 ,
                     Plugin.getPluginManager().getCurrentDate().getDayOfMonth() ,
                     0 ,
                     0 ) ;

    Calendar programstart = Calendar.getInstance() ;
    programstart.set( p.getDate().getYear() ,
                      p.getDate().getMonth() - 1 ,
                      p.getDate().getDayOfMonth() ,
                      p.getHours() ,
                      p.getMinutes() ) ;

    long nowMinute = Math.floor( ( System.currentTimeMillis() / 60000 ) % 1440 )
                     + Math.floor( programdate.getTimeInMillis() / 60000 ) ;

    if ( ( Math.floor( System.currentTimeMillis() / 3600000 ) % 24 >= 0 )
         &&
         ( Math.floor( System.currentTimeMillis() / 3600000 ) % 24 <= 3 ) )
        nowMinute += 1440 ;

    long startminute = programstart.getTimeInMillis() / 60000 ;
    long endMinute = startminute + p.getLength() - 1 ;

    return ( ( endMinute >= ( nowMinute - acceptablePreTimeMinutes ) )
             &&
             ( startminute <= ( nowMinute + acceptablePostTimeMinutes ) ) ) ;
}

return ( BeanShellProgramFilterIf ) this ;
Lenz :meld:
 

Zurück
Oben