year Come cambiare TIMEZONE per un java.util.Calendar/Date




java string to date (2)

Vorrei cambiare il valore TIMEZONE in un'istanza di Java Calendar in fase di runtime. Ho provato di seguito. Ma l'output è lo stesso in entrambi i casi:

    Calendar cSchedStartCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
    System.out.println(cSchedStartCal.getTime().getTime());
    cSchedStartCal.setTimeZone(TimeZone.getTimeZone("Asia/Calcutta"));
    System.out.println(cSchedStartCal.getTime().getTime());

PRODUZIONE:
1353402486773
1353402486773

Ho provato anche questo, ma l'output è sempre lo stesso:

    Calendar cSchedStartCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
    System.out.println(cSchedStartCal.getTime());

    Calendar cSchedStartCal1 = Calendar.getInstance(TimeZone.getTimeZone("Asia/Calcutta"));
    cSchedStartCal1.setTime(cSchedStartCal.getTime());
    System.out.println(cSchedStartCal.getTime());

Nell'API sto vedendo il commento qui sotto ma non riesco a capirlo molto:

     * calls: cal.setTimeZone(EST); cal.set(HOUR, 1); cal.setTimeZone(PST).
     * Is cal set to 1 o'clock EST or 1 o'clock PST?  Answer: PST.  More
     * generally, a call to setTimeZone() affects calls to set() BEFORE AND
     * AFTER it up to the next call to complete().

Per favore potete aiutarmi?

Una possibile soluzione:

    Calendar cSchedStartCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
    long gmtTime = cSchedStartCal.getTime().getTime();

    long timezoneAlteredTime = gmtTime + TimeZone.getTimeZone("Asia/Calcutta").getRawOffset();
    Calendar cSchedStartCal1 = Calendar.getInstance(TimeZone.getTimeZone("Asia/Calcutta"));
    cSchedStartCal1.setTimeInMillis(timezoneAlteredTime);

Questa soluzione è ok?


In Java, le date sono internamente rappresentate in millisecondi UTC dall'epoca (quindi i fusi orari non vengono presi in considerazione, ecco perché si ottengono gli stessi risultati, dato che getTime() fornisce i millisecondi citati).
Nella tua soluzione:

Calendar cSchedStartCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
long gmtTime = cSchedStartCal.getTime().getTime();

long timezoneAlteredTime = gmtTime + TimeZone.getTimeZone("Asia/Calcutta").getRawOffset();
Calendar cSchedStartCal1 = Calendar.getInstance(TimeZone.getTimeZone("Asia/Calcutta"));
cSchedStartCal1.setTimeInMillis(timezoneAlteredTime);

basta aggiungere l'offset da GMT al fuso orario specificato ("Asia / Calcutta" nell'esempio) in millisecondi, quindi questo dovrebbe funzionare correttamente.

Un'altra possibile soluzione potrebbe essere quella di utilizzare i campi statici della classe Calendar :

//instantiates a calendar using the current time in the specified timezone
Calendar cSchedStartCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
//change the timezone
cSchedStartCal.setTimeZone(TimeZone.getTimeZone("Asia/Calcutta"));
//get the current hour of the day in the new timezone
cSchedStartCal.get(Calendar.HOUR_OF_DAY);

Fare riferimento a .com/questions/7695859/ per una spiegazione più approfondita.


  1. La classe Date/Timestamp rappresenta un istante specifico nel tempo, con precisione millisecondo, dal 1 gennaio 1970 alle 00:00:00 GMT. Quindi questa differenza di orario (da epoca a ora corrente) sarà la stessa in tutti i computer in tutto il mondo, indipendentemente dal fuso orario.

  2. Date/Timestamp non sa sull'orario dato è su quale fuso orario.

  3. Se vogliamo il tempo in base al fuso orario, dovremmo andare per le classi Calendar o SimpleDateFormat in java.

  4. Se si tenta di stampare un oggetto Data / Timestamp usando toString() , convertirà e stamperà l'ora con il fuso orario predefinito della macchina.

  5. Quindi possiamo dire (Date / Timestamp) .getTime () l'oggetto avrà sempre UTC (tempo in millisecondi)

  6. Per concludere Date.getTime() fornirà l'ora UTC, ma toString() trova sul fuso orario specifico della locale, non su quello UTC.

Ora come creo / cambio il tempo in un fuso orario specificato?

Il codice seguente ti dà una data (tempo in millisecondi) con fusi orari specificati. L'unico problema qui è che devi dare una data in formato stringa.

   DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd HH:mm:ss");
   dateFormatLocal.setTimeZone(timeZone);
   java.util.Date parsedDate = dateFormatLocal.parse(date);

Utilizzare dateFormat.format per prendere la data di input (che è sempre UTC), il fuso orario e la data di restituzione come String.

Come memorizzare l'ora UTC / GMT nel DB:

Se si stampa l'oggetto parsedDate , l'ora sarà nel fuso orario predefinito. Ma puoi memorizzare l'ora UTC in DB come di seguito.

        Calendar calGMT = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
        Timestamp tsSchedStartTime = new Timestamp (parsedDate.getTime());
        if (tsSchedStartTime != null) {
            stmt.setTimestamp(11, tsSchedStartTime, calGMT );
        } else {
            stmt.setNull(11, java.sql.Types.DATE);
        }




calendar