Konvertieren Sie Datum / Uhrzeit für eine bestimmte Zeitzone - Java


79

Ich möchte diesen GMT-Zeitstempel in GMT + 13 konvertieren:

2011-10-06 03:35:05

Ich habe ungefähr 100 verschiedene Kombinationen von DateFormat, TimeZone, Date, GregorianCalendar usw. ausprobiert, um diese SEHR grundlegende Aufgabe zu erledigen.

Dieser Code macht das, was ich für die AKTUELLE ZEIT will:

Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("GMT"));

DateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm:ss z");    
formatter.setTimeZone(TimeZone.getTimeZone("GMT+13"));  

String newZealandTime = formatter.format(calendar.getTime());

Ich möchte jedoch die Zeit einstellen, anstatt die aktuelle Zeit zu verwenden.

Ich habe festgestellt, dass ich jedes Mal, wenn ich versuche, die Zeit so einzustellen:

calendar.setTime(new Date(1317816735000L));

Die TimeZone des lokalen Computers wird verwendet. Warum das? Ich weiß, dass, wenn "new Date ()" UTC + 0 Zeit zurückgibt, warum beim Einstellen der Zeit in Millisekunden nicht mehr davon ausgegangen wird, dass die Zeit in UTC ist?

Ist es möglich, zu:

  1. Stellen Sie die Uhrzeit für ein Objekt ein (Kalender / Datum / Zeitstempel).
  2. (Möglicherweise) Legen Sie die Zeitzone des anfänglichen Zeitstempels fest (calendar.setTimeZone (...))
  3. Formatieren Sie den Zeitstempel mit einer neuen Zeitzone (formatter.setTimeZone (...)).
  4. Gibt eine Zeichenfolge mit neuer Zeitzonenzeit zurück. (formatter.format (calendar.getTime ()))

Vielen Dank im Voraus für jede Hilfe: D.


Zu viele Fragen in einem Beitrag ...
Barmaley

Dieselben 2 Fragen, die gestellt werden, nur die zweite wird ein zweites Mal mit einem Szenarioalgorithmus zur Klarheit gestellt. Danke für die Eingabe tho :?
Travega

Das einzige Problem scheint zu sein, dass 1317816735000Lder falsche Zeitstempel für ist 2011-10-06 03:35:05 GMT. Ansonsten ist Ihr Ansatz korrekt.
August

1
Zu Ihrer Information, die störenden alten Datum Zeitklassen wie java.util.Date, java.util.Calendarund java.text.SimpleDateFormatsind jetzt Erbe , durch die verdrängte java.time Klassen in Java gebaut 8 und höher. Siehe Tutorial von Oracle .
Basil Bourque

Antworten:


58

Für mich ist der einfachste Weg, dies zu tun:

Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

//Here you say to java the initial timezone. This is the secret
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
//Will print in UTC
System.out.println(sdf.format(calendar.getTime()));    

//Here you set to your timezone
sdf.setTimeZone(TimeZone.getDefault());
//Will print on your default Timezone
System.out.println(sdf.format(calendar.getTime()));

1
@ Charlesleston Was ist die reviewin der Schlangedate = sdf.parse(review);
09Q71AO534

1
@Charleston Aber es gibt keinen solchen Methodentyp in SDF, der sdf.parse(DateObject)in Java, das ich verwende , nicht definiert ist JDK.1.7.
09Q71AO534

Meine zweite Antwort tut mir so leid. Ich habe es nicht einmal getestet! Aber jetzt ist es getestet und funktioniert!
Charleston

1
Wie erhält man ein tatsächliches Datum anstelle eines Strings?
Tulains Córdova

1
Vielleicht sollte es sein: SimpleDateFormat ("JJJJ-MM-TT hh: mm: ss")
Marcos

31

Es ist sehr wichtig zu verstehen, wie Computerzeit funktioniert. Vor diesem Hintergrund stimme ich zu, dass eine API, mit der Sie Computerzeit wie in Echtzeit verarbeiten können, so funktionieren sollte, dass Sie sie wie in Echtzeit behandeln können. Zum größten Teil ist dies der Fall, aber es gibt einige wichtige Versehen, die Aufmerksamkeit erfordern.

Jedenfalls schweife ich ab !! Wenn Sie einen UTC-Offset haben (besser in UTC als in GMT-Offsets), können Sie die Zeit in Millisekunden berechnen und zu Ihrem Zeitstempel hinzufügen. Beachten Sie, dass ein SQL-Zeitstempel von einem Java-Zeitstempel abweichen kann, da die Art und Weise, wie der Ablauf der Epoche berechnet wird, nicht immer gleich ist - abhängig von Datenbanktechnologien und auch Betriebssystemen.

Ich würde Ihnen raten, System.currentTimeMillis () als Zeitstempel zu verwenden, da diese in Java konsistenter verarbeitet werden können, ohne sich Gedanken über die Konvertierung von SQL-Zeitstempeln in Java-Datumsobjekte usw. machen zu müssen.

Um Ihren Offset zu berechnen, können Sie Folgendes versuchen:

Long gmtTime =1317951113613L; // 2.32pm NZDT
Long timezoneAlteredTime = 0L;

if (offset != 0L) {
    int multiplier = (offset*60)*(60*1000);
    timezoneAlteredTime = gmtTime + multiplier;
} else {
    timezoneAlteredTime = gmtTime;
}

Calendar calendar = new GregorianCalendar();
calendar.setTimeInMillis(timezoneAlteredTime);

DateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm:ss z");

formatter.setCalendar(calendar);
formatter.setTimeZone(TimeZone.getTimeZone(timeZone));

String newZealandTime = formatter.format(calendar.getTime());

Ich hoffe das ist hilfreich!


@ user726478 Ist das richtig, wenn wir die Zeitzonenzeichenfolge kennen? lange ZeitzoneAlteredTime = gmtTime + TimeZone.getTimeZone ("Asien / Kalkutta"). getRawOffset (); "
Kanagavelu Sugumar

3
Nicht gut. Der Zeitzonenversatz ist nicht konstant. Es hängt vom tatsächlichen Datum ab.
Dmitry Trifonov

1
Wie erhält man ein tatsächliches Datum anstelle eines Strings?
Tulains Córdova

@ KanagaveluSugumar hier Offset ist Stunden
MEIN

25

Wie immer empfehle ich, diesen Artikel über Datum und Uhrzeit in Java zu lesen , damit Sie ihn verstehen.

Die Grundidee ist, dass "unter der Haube" alles in UTC-Millisekunden seit der Epoche erledigt wird. Dies bedeutet, dass es am einfachsten ist, wenn Sie überhaupt keine Zeitzonen verwenden, mit Ausnahme der Zeichenfolgenformatierung für den Benutzer.

Daher würde ich die meisten von Ihnen vorgeschlagenen Schritte überspringen.

  1. Stellen Sie die Uhrzeit für ein Objekt ein (Datum, Kalender usw.).
  2. Legen Sie die Zeitzone für ein Formatierungsobjekt fest.
  3. Gibt einen String aus dem Formatierer zurück.

Alternativ können Sie die Joda-Zeit verwenden . Ich habe gehört, es ist eine viel intuitivere Datetime-API.


Hallo Bringer128, danke für deine Antwort. Es scheint mir nur lächerlich, dass es keinen einfachen Weg gibt, einen Zeitstempel für eine bestimmte Zeitzone anzupassen. Warum die Funktionalität einschließen, wenn sie nur das Zeitzonen-Tag in der formatierten Zeichenfolge ändert ... Ich werde die Joda-Zeit ausprobieren. Danke
travega

@travega Es gibt eine einfache Möglichkeit, wenn Sie Ihre Zeit als UTC darstellen und mit einem SimpleDateFormat formatieren. Es wird nicht nur der 'Z'-Teil (das Zeitzonen-Tag) geändert, sondern das gesamte Datum. Überprüfen Sie die Ergebnisse, wenn zwei verschiedene SimpleDateFormat-Objekte mit unterschiedlichen Zeitzonen festgelegt wurden, wenn sie dasselbe Datum formatieren.
Bringer128

Wie erhält man ein tatsächliches Datum anstelle eines Strings?
Tulains Córdova

@ TulainsCórdova Ich denke, Sie müssen genauer erklären. Können Sie eine Frage erstellen oder suchen, um eine verwandte Frage zu finden, die Ihre spezifische Frage lösen könnte?
Bringer128

19

tl; dr

Instant.ofEpochMilli( 1_317_816_735_000L )
    .atZone( ZoneId.of( "Pacific/Auckland" ) )
    .format( DateTimeFormatter.ofLocalizedDateTime( FormatStyle.MEDIUM ).withLocale( new Locale( "en" , "NZ" ) ) )

…ebenfalls…

LocalDateTime.parse( "2011-10-06 03:35:05".replace( " " , "T" ) )
    .atZone( ZoneId.of( "Pacific/Auckland" ) )

java.time

Die Frage und die meisten Antworten verwenden veraltete ältere Datums- und Zeitklassen aus den frühesten Versionen von Java. Diese alten Klassen haben sich als mühsam und verwirrend erwiesen. Vermeide sie. Verwenden Sie stattdessen die Klassen java.time.

ISO 8601

Ihre Eingabezeichenfolge hat fast das Standardformat ISO 8601. Ersetzen Sie einfach den SPACE in der Mitte durch a T.

String input = "2011-10-06 03:35:05".replace( " " , "T" );

LocalDateTime

Analysieren Sie jetzt als, LocalDateTimeda der Eingabe keine Informationen zum Versatz von UTC oder zur Zeitzone fehlen. A LocalDateTimehat kein Konzept von Offset noch Zeitzone, so dass es sich nicht ein tatsächliches Moment auf der Zeitleiste darstellen.

LocalDateTime ldt = LocalDateTime.parse( input );

ZoneOffset

Sie scheinen zu sagen, dass Sie aus dem Geschäftskontext wissen, dass die Absicht dieser Zeichenfolge darin besteht, einen Moment darzustellen, der 13 Stunden vor UTC liegt. Also instanziieren wir a ZoneOffset.

ZoneOffset offset = ZoneOffset.ofHours( 13 ); // 13 hours ahead of UTC, in the far east of the globe.

OffsetDateTime

Wenden Sie es an, um ein OffsetDateTimeObjekt zu erhalten. Dies wird zu einem tatsächlichen Moment auf der Zeitachse.

OffsetDateTime odt = ldt.atOffset( offset);

ZoneId

Aber dann erwähnen Sie Neuseeland. Sie hatten also eine bestimmte Zeitzone im Sinn. Eine Zeitzone ist ein Versatz von UTC sowie eine Reihe von Regeln für die Behandlung von Anomalien wie Sommerzeit (DST). So können wir eine angeben ZoneIdzu einem ZonedDateTimeeher als ein bloßen versetzt.

Geben Sie einen geeigneten Zeitzonennamen an . Verwenden Sie niemals die Abkürzung mit 3-4 Buchstaben, da ESToder ISTda es sich nicht um echte Zeitzonen handelt, die nicht standardisiert und nicht einmal eindeutig (!) Sind. Zum Beispiel Pacific/Auckland.

ZoneId z = ZoneId.of( "Pacific/Auckland" );

ZonedDateTime

Wenden Sie die an ZoneId.

ZonedDateTime zdt = ldt.atZone( z );

Sie können ganz einfach für den gleichen Moment auf der Zeitachse in eine andere Zone wechseln.

ZoneId zParis = ZoneId.of( "Europe/Paris" );
ZonedDateTime zdtParis = zdt.withZoneSameInstant( zParis );  // Same moment in time, but seen through lens of Paris wall-clock time.

Zähle aus der Epoche

Ich empfehle dringend, Datums- und Uhrzeitwerte nicht als Epoche zu betrachten, z. B. Millisekunden ab Anfang 1970 UTC. Aber wenn Sie müssen, erstellen Sie eine Instantaus einer solchen Nummer.

Instant instant = Instant.ofEpochMilli( 1_317_816_735_000L );

Weisen Sie dann, falls gewünscht, eine Zeitzone wie oben gezeigt zu, um sich von UTC zu entfernen.

ZoneId z = ZoneId.of( "Pacific/Auckland" );
ZonedDateTime zdt = instant.atZone( z );

Ihr Wert 1_317_816_735_000List:

  • 2011-10-05T12:12:15Z (Mi, 05. Oktober 2011, 12:12:15 GMT)
  • 2011-10-06T01:12:15+13:00[Pacific/Auckland] (Donnerstag, 6. Oktober 2011, 01:12:15 Uhr in Auckland, Neuseeland).

Strings generieren

Rufen Sie einfach auf, um eine Zeichenfolge im Standardformat ISO 8601 zu generieren toString. Beachten Sie, dass ZonedDateTimedas Standardformat sinnvoll erweitert wird, indem der Name der Zeitzone in eckigen Klammern angehängt wird.

String output = zdt.toString();

Suchen Sie für andere Formate im Stapelüberlauf nach DateTimeFormatterKlasse. Bereits viele Male abgedeckt.

Geben Sie a FormatStyleund a an Locale.

Locale l = new Locale( "en" , "NZ" );
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.MEDIUM ).withLocale( l );
String output = zdt.format( f );

Beachten Sie, dass die Zeitzone nichts mit dem Gebietsschema zu tun hat. Sie können eine Europe/ParisDatums- und Uhrzeitangabe in japanischer Sprache und kulturellen Normen oder eine Asia/KolkataDatums- und Uhrzeitanzeige in portugiesischer Sprache und in brasilianischen Kulturnormen anzeigen lassen.

Über java.time

Das java.time- Framework ist in Java 8 und höher integriert. Diese Klassen verdrängen die lästigen alten Datum Zeitklassen wie java.util.Date, .Calendar, & java.text.SimpleDateFormat.

Das Joda-Time- Projekt, das sich jetzt im Wartungsmodus befindet , empfiehlt die Migration zu java.time.

Weitere Informationen finden Sie im Oracle-Lernprogramm . Suchen Sie im Stapelüberlauf nach vielen Beispielen und Erklärungen.

Ein großer Teil der java.time Funktionalität zurückportiert zu Java 6 und 7 in ThreeTen-Backport und weiter angepasst Android in ThreeTenABP (siehe So verwenden ... ).

Das ThreeTen-Extra- Projekt erweitert java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Ergänzungen von java.time. Sie können einige nützliche Klassen hier wie finden Interval, YearWeek, YearQuarterund vieles mehr.


9

Die Lösung ist eigentlich ganz einfach (reines, einfaches Java):

System.out.println(" NZ Local Time: 2011-10-06 03:35:05");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime localNZ = LocalDateTime.parse("2011-10-06 03:35:05",formatter);
ZonedDateTime zonedNZ = ZonedDateTime.of(localNZ,ZoneId.of("+13:00"));
LocalDateTime localUTC = zonedNZ.withZoneSameInstant(ZoneId.of("UTC")).toLocalDateTime();
System.out.println("UTC Local Time: "+localUTC.format(formatter));

AUSGABE IST:

 NZ Local Time: 2011-10-06 03:35:05
UTC Local Time: 2011-10-05 14:35:05

1
Dies wurde vor 4 Jahren gelöst und Ihre Lösung fügt nichts Neues hinzu.
Travega

1
Ich denke, dass dies ein neuer Ansatz mit Java 8 ist, aber die Antwortqualität ist gering.
Przemek

6

Ich habe mich umgesehen und glaube nicht, dass es in Java eine Zeitzone gibt, die GMT + 13 ist. Ich denke, Sie müssen Folgendes verwenden:

Calendar calendar = Calendar.getInstance();
//OR Calendar.getInstance(TimeZone.getTimeZone("GMT"));

calendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY)+13);

Date d = calendar.getTime();

(Wenn dies der Fall ist, ändern Sie "GMT" in diese Zeitzone und entfernen Sie die 2. Codezeile.)

ODER

SimpleDateFormat df = new SimpleDateFormat();
df.setTimeZone(TimeZone.getTimeZone("GMT+13"));
System.out.println(df.format(c.getTime()));

Wenn Sie eine bestimmte Uhrzeit / ein bestimmtes Datum einstellen möchten, können Sie auch Folgendes verwenden:

    calendar.set(Calendar.DATE, 15);
calendar.set(Calendar.MONTH, 3);
calendar.set(Calendar.YEAR, 2011);
calendar.set(Calendar.HOUR_OF_DAY, 13); 
calendar.set(Calendar.MINUTE, 45);
calendar.set(Calendar.SECOND, 00);

1
Hey Craig, danke für deine Antwort. Java unterstützt keine / nicht unterstützten ISO-Zeitstandards GMT ist ein globaler Zeitstandard, der unabhängig von Java moderiert wird. Die Zeit- / Kalender-Apis entsprechen dem Standard und GMT + 13 bezieht sich auf NZDT oder Sommerzeit in jeder GMT + 12-Zone. In Bezug auf Ihren Beispielcode funktioniert Ihr Szenario problemlos, wie in meiner IP angegeben. Das Problem, mit dem ich konfrontiert bin, besteht darin, einen Zeitstempel zu definieren und genaue zeitzonenspezifische Varianten des ursprünglichen Zeitstempels auszugeben, NICHT Ableitungen der aktuellen Zeit, wie es Ihr Code tut. Danke T
travega

3

Wir können damit umgehen, indem wir den Versatzwert verwenden

 public static long convertDateTimeZone(long lngDate, String fromTimeZone,
        String toTimeZone){
    TimeZone toTZ = TimeZone.getTimeZone(toTimeZone);
    Calendar toCal = Calendar.getInstance(toTZ);        

    TimeZone fromTZ = TimeZone.getTimeZone(fromTimeZone);
    Calendar fromCal = Calendar.getInstance(fromTZ);
    fromCal.setTimeInMillis(lngDate);
    toCal.setTimeInMillis(fromCal.getTimeInMillis()
            + toTZ.getOffset(fromCal.getTimeInMillis())
            - TimeZone.getDefault().getOffset(fromCal.getTimeInMillis()));      
    return toCal.getTimeInMillis();
}

Testcode-Snippet:

 System.out.println(new Date().getTime())
 System.out.println(convertDateTimeZone(new Date().getTime(), TimeZone
                .getDefault().getID(), "EST"));

Ausgabe: 1387353270742 1387335270742


2

Ich habe diesen Code ausprobiert

try{
            SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss Z");
            Date datetime = new Date();

            System.out.println("date "+sdf.format(datetime));

            sdf.setTimeZone(TimeZone.getTimeZone("GMT"));

            System.out.println("GMT "+ sdf.format(datetime));

            sdf.setTimeZone(TimeZone.getTimeZone("GMT+13"));

            System.out.println("GMT+13 "+ sdf.format(datetime));

            sdf.setTimeZone(TimeZone.getTimeZone("UTC"));

            System.out.println("utc "+sdf.format(datetime));

            Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("GMT"));

            DateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm:ss z");    
            formatter.setTimeZone(TimeZone.getTimeZone("GMT+13"));  

            String newZealandTime = formatter.format(calendar.getTime());

            System.out.println("using calendar "+newZealandTime);

        }catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

und dieses Ergebnis zu bekommen

date 06-10-2011 10:40:05 +0530
GMT 06-10-2011 05:10:05 +0000 // here getting 5:10:05
GMT+13 06-10-2011 06:10:05 +1300 // here getting 6:10:05
utc 06-10-2011 05:10:05 +0000
using calendar 06 Oct 2011 18:10:05 GMT+13:00

Hallo Pratik, danke für deine Eingabe, aber du verpasst den Punkt. Wie in meiner IP erwähnt, funktioniert es für einen aktuellen Zeitstempel. Das Problem besteht darin, einen Zeitstempel festzulegen und dann eine genaue zeitzonenspezifische Ausgabe zu generieren.
Travega

Ja, es funktioniert auch, wenn Sie die Zeit ändern. Die Zeitzone wurde in das
Formatobjekt

Hmmmm ... Ich habe versucht hinzuzufügen: datetime.setTime (Timestamp.valueOf ("2011-10-06 03:35:05"). GetTime ()); Und trotzdem funktioniert es nicht. Wie denkst du, funktioniert es, wenn du die Zeit einstellst?
Travega

@Pratik: Wie kann ich die AST-Zeitzone erhalten?
Ved Prakash

2

Joda-Zeit

Die Klassen java.util.Date/Calendar sind ein Chaos und sollten vermieden werden.

Update: Das Joda-Time-Projekt befindet sich im Wartungsmodus. Das Team empfiehlt die Migration zu den Klassen java.time.

Hier ist Ihre Antwort mit der Joda-Time 2.3-Bibliothek. Sehr leicht.

Wie im Beispielcode angegeben, empfehle ich, wo immer möglich benannte Zeitzonen zu verwenden, damit Ihre Programmierung die Sommerzeit verarbeiten kann (DST) und andere Anomalien verarbeiten kann.

Wenn Sie Tanstelle eines Leerzeichens ein in der Mitte Ihrer Zeichenfolge platziert haben , können Sie die ersten beiden Codezeilen überspringen und sich mit einem Formatierer befassen, um die Zeichenfolge zu analysieren. Der DateTime- Konstruktor kann eine Zeichenfolge im ISO 8601- Format annehmen .

// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
// import org.joda.time.*;
// import org.joda.time.format.*;

// Parse string as a date-time in UTC (no time zone offset).
DateTimeFormatter formatter = org.joda.time.format.DateTimeFormat.forPattern( "yyyy-MM-dd' 'HH:mm:ss" );
DateTime dateTimeInUTC = formatter.withZoneUTC().parseDateTime( "2011-10-06 03:35:05" );

// Adjust for 13 hour offset from UTC/GMT.
DateTimeZone offsetThirteen = DateTimeZone.forOffsetHours( 13 );
DateTime thirteenDateTime = dateTimeInUTC.toDateTime( offsetThirteen );

// Hard-coded offsets should be avoided. Better to use a desired time zone for handling Daylight Saving Time (DST) and other anomalies.
// Time Zone list… http://joda-time.sourceforge.net/timezones.html
DateTimeZone timeZoneTongatapu = DateTimeZone.forID( "Pacific/Tongatapu" );
DateTime tongatapuDateTime = dateTimeInUTC.toDateTime( timeZoneTongatapu );

Dump diese Werte ...

System.out.println( "dateTimeInUTC: " + dateTimeInUTC );
System.out.println( "thirteenDateTime: " + thirteenDateTime );
System.out.println( "tongatapuDateTime: " + tongatapuDateTime );

Beim Laufen…

dateTimeInUTC: 2011-10-06T03:35:05.000Z
thirteenDateTime: 2011-10-06T16:35:05.000+13:00
tongatapuDateTime: 2011-10-06T16:35:05.000+13:00

2

Datum und Uhrzeit für alle Zeitzonen anzeigen

import java.util.Calendar;
import java.util.TimeZone;
import java.text.DateFormat;
import java.text.SimpleDateFormat;



static final String ISO8601 = "yyyy-MM-dd'T'HH:mm:ssZ";
DateFormat dateFormat = new SimpleDateFormat(ISO8601);
Calendar c = Calendar.getInstance();
String formattedTime;
for (String availableID : TimeZone.getAvailableIDs()) {
    dateFormat.setTimeZone(TimeZone.getTimeZone(availableID));
    formattedTime = dateFormat.format(c.getTime());
    System.out.println(formattedTime + " " + availableID);
}

1

Wir können den UTC / GMT-Zeitstempel ab dem angegebenen Datum erhalten.

/**
 * Get the time stamp in GMT/UTC by passing the valid time (dd-MM-yyyy HH:mm:ss)
 */
public static long getGMTTimeStampFromDate(String datetime) {
    long timeStamp = 0;
    Date localTime = new Date();

    String format = "dd-MM-yyyy HH:mm:ss";
    SimpleDateFormat sdfLocalFormat = new SimpleDateFormat(format);
    sdfLocalFormat.setTimeZone(TimeZone.getDefault());

    try {

        localTime = (Date) sdfLocalFormat.parse(datetime); 

        Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"),
                Locale.getDefault());
        TimeZone tz = cal.getTimeZone();

        cal.setTime(localTime);

        timeStamp = (localTime.getTime()/1000);
        Log.d("GMT TimeStamp: ", " Date TimegmtTime: " + datetime
                + ", GMT TimeStamp : " + localTime.getTime());

    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return timeStamp;

}

Die UTC-Zeit wird basierend auf dem übergebenen Datum zurückgegeben.

  • Wir können den UTC-Zeitstempel auf das aktuelle Datum und die aktuelle Uhrzeit umkehren (umgekehrt).

        public static String getLocalTimeFromGMT(long gmtTimeStamp) {
                 try{
                        Calendar calendar = Calendar.getInstance();
                        TimeZone tz = TimeZone.getDefault();
                        calendar.setTimeInMillis(gmtTimeStamp * 1000);
        //              calendar.add(Calendar.MILLISECOND, tz.getOffset(calendar.getTimeInMillis())); 
                        SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
                        Date currenTimeZone = (Date) calendar.getTime();
                        return sdf.format(currenTimeZone);
                    }catch (Exception e) {
                    }
                    return "";  
                }
    

Ich hoffe das wird anderen helfen. Vielen Dank!!


1

Ein schneller Weg ist:

String dateText ="Thu, 02 Jul 2015 21:51:46";
long hours = -5; // time difference between places

DateTimeFormatter formatter = DateTimeFormatter.ofPattern(E, dd MMM yyyy HH:mm:ss, Locale.ENGLISH);     
LocalDateTime date = LocalDateTime.parse(dateText, formatter);        
date = date.with(date.plusHours(hours));

System.out.println("NEW DATE: "+date);

Ausgabe

NEUES DATUM: 2015-07-02T16: 51: 46


1

Ihr Ansatz funktioniert ohne Änderungen.

Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
// Timestamp for 2011-10-06 03:35:05 GMT
calendar.setTime(new Date(1317872105000L));

DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z"); 
formatter.setTimeZone(TimeZone.getTimeZone("GMT+13"));

// Prints 2011-10-06 16:35:05 GMT+13:00
System.out.println(formatter.format(calendar.getTime()));

1
public Timestamp convertLocalTimeToServerDatetime(String dt,String timezone){

    String clientDnT = dt ;// "2017-06-01 07:20:00";
    try{
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date date = sdf.parse(clientDnT);
    TimeZone tz = TimeZone.getTimeZone(timezone.trim()); // get time zone of user
    sdf.setTimeZone(tz);

    // Convert to servertime zone 
    SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    TimeZone tzInAmerica = TimeZone.getDefault();
    sdf1.setTimeZone(tzInAmerica);

    // assign date to date
    String serverDate = sdf1.format(date);

    // Convert to servertime zone to Timestamp
    Date date2 =  sdf.parse(serverDate);
    Timestamp tsm = new Timestamp(date2.getTime());
    return  tsm;
    }
    catch(Exception e){
        System.err.println(e);
    }

    return null;
}

Bitte übergeben Sie Datum und Client-Zeitzone , dann gibt die Methode den Server-Zeitstempel zurück. Für Javascript var _timezone = Intl.DateTimeFormat().resolvedOptions().timeZone; und in Java TimeZone tz = TimeZone.getDefault(); tz.getID()
Sourav Barman

1

Dauer oder Zeitintervall mit zwei verschiedenen Zeitzonen ermitteln

import org.joda.time.{DateTime, Period, PeriodType}

val s1 = "2019-06-13T05:50:00-07:00"
val s2 = "2019-10-09T11:30:00+09:00"    

val period = new Period(DateTime.parse(s1), DateTime.parse(s2), PeriodType dayTime())

period.getDays
period.getMinutes
period.getHours

Ausgabeperiode = P117DT13H40M

days = 117
minutes = 40
hours = 13

1

Ich möchte die moderne Antwort geben.

Sie sollten nicht wirklich ein Datum und eine Uhrzeit von einer Zeichenfolge mit einem GMT-Versatz in eine Zeichenfolge mit einem anderen GMT-Versatz und mit einem anderen Format konvertieren möchten. Behalten Sie in Ihrem Programm einen Augenblick (einen Zeitpunkt) als geeignetes Datum / Uhrzeit-Objekt bei. Formatieren Sie Ihr Objekt nur dann in die gewünschte Zeichenfolge, wenn Sie eine Zeichenfolgenausgabe angeben müssen.

java.time

Eingabe analysieren

    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .append(DateTimeFormatter.ISO_LOCAL_DATE)
            .appendLiteral(' ')
            .append(DateTimeFormatter.ISO_LOCAL_TIME)
            .toFormatter();

    String dateTimeString = "2011-10-06 03:35:05";
    Instant instant = LocalDateTime.parse(dateTimeString, formatter)
            .atOffset(ZoneOffset.UTC)
            .toInstant();

Für die meisten Zwecke Instantist es eine gute Wahl, einen Zeitpunkt zu speichern. Wenn Sie deutlich machen müssen, dass Datum und Uhrzeit von GMT stammen, verwenden Sie OffsetDateTimestattdessen ein.

Ausgabe konvertieren, formatieren und drucken

    ZoneId desiredZone = ZoneId.of("Pacific/Auckland");
    Locale desiredeLocale = Locale.forLanguageTag("en-NZ");
    DateTimeFormatter desiredFormatter = DateTimeFormatter.ofPattern(
            "dd MMM uuuu HH:mm:ss OOOO", desiredeLocale);

    ZonedDateTime desiredDateTime = instant.atZone(desiredZone);
    String result = desiredDateTime.format(desiredFormatter);
    System.out.println(result);

Dies gedruckt:

06. Oktober 2011 16:35:05 GMT + 13: 00

Ich habe die Zeitzone Pazifik / Auckland anstelle des von Ihnen erwähnten Versatzes +13: 00 angegeben. Ich habe verstanden, dass Sie neuseeländische Zeit wollten, und Pacific / Auckland sagt dem Leser dies besser. Die Zeitzone berücksichtigt auch die Sommerzeit (DST), sodass Sie dies (in den meisten Fällen) nicht in Ihrem eigenen Code berücksichtigen müssen.

Da Octes auf Englisch ist, ist es eine gute Idee, dem Formatierer ein explizites Gebietsschema zu geben. GMTkönnte auch lokalisiert sein, aber ich denke, dass es nur GMTin allen Gebietsschemas gedruckt wird .

OOOOIm Format Musterzeichenfolge ist eine Möglichkeit zum Drucken des Versatzes. Dies ist möglicherweise eine bessere Idee als das Drucken der Zeitzonenabkürzung, die Sie erhalten würden, zda Zeitzonenabkürzungen häufig nicht eindeutig sind. Wenn Sie möchten NZDT(für New Zealand Daylight Time), legen Sie zstattdessen einfach dort.

Deine Fragen

Ich werde Ihre nummerierten Fragen in Bezug auf die modernen Klassen in java.time beantworten.

Ist möglich zu:

  1. Stellen Sie die Zeit für ein Objekt ein

Nein, die modernen Klassen sind unveränderlich. Sie müssen ein Objekt erstellen, das von Anfang an das gewünschte Datum und die gewünschte Uhrzeit hat (dies hat eine Reihe von Vorteilen, einschließlich der Thread-Sicherheit).

  1. (Möglicherweise) Stellen Sie die Zeitzone des anfänglichen Zeitstempels ein

Die atZoneMethode, die ich im Code verwende, gibt a ZonedDateTimemit der angegebenen Zeitzone zurück. Andere Datums- / Uhrzeitklassen haben eine ähnliche Methode, manchmal genannt atZoneSameInstantoder andere Namen.

  1. Formatieren Sie den Zeitstempel mit einer neuen Zeitzone

Mit java.time sind das Konvertieren in eine neue Zeitzone und das Formatieren zwei verschiedene Schritte, wie gezeigt.

  1. Gibt eine Zeichenfolge mit neuer Zeitzonenzeit zurück.

Ja, konvertieren Sie wie gezeigt in die gewünschte Zeitzone und formatieren Sie wie gezeigt.

Ich habe festgestellt, dass ich jedes Mal, wenn ich versuche, die Zeit so einzustellen:

calendar.setTime(new Date(1317816735000L));

Die TimeZone des lokalen Computers wird verwendet. Warum das?

Es ist nicht so, wie Sie denken, was gut dazu beiträgt, nur einige der (vielen) Designprobleme mit den alten Klassen aufzuzeigen.

  • A Datehat keine Zeitzone. Nur wenn Sie es drucken, toStringerfasst seine Methode Ihre lokale Zeitzone und verwendet sie zum Rendern der Zeichenfolge. Dies gilt fürnew Date() . Dieses Verhalten hat in den letzten 25 Jahren viele, viele Programmierer verwirrt.
  • A Calender hat eine Zeitzone. Es ändert sich nicht, wenn Sie es tun calendar.setTime(new Date(1317816735000L));.

Verknüpfung

Oracle-Tutorial: Datum Uhrzeit zur Erläuterung der Verwendung von java.time.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.