it-swarm.com.de

Datum/Uhrzeit für die angegebene Zeitzone - java umrechnen

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

2011-10-06 03:35:05

Ich habe ungefähr 100 verschiedene Kombinationen aus DateFormat, TimeZone, Date, GregorianCalendar usw. ausprobiert, um zu versuchen, diese sehr grundlegende Aufgabe auszuführen.

Dieser Code macht, 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());

Aber ich möchte die Uhrzeit lieber als die aktuelle Uhrzeit einstellen. 

Ich fand das immer, 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 ()" die UTC + 0-Zeit zurückgibt, warum also, wenn Sie die Zeit in Millisekunden einstellen, nicht mehr davon ausgegangen werden, dass die Zeit in UTC ist?

Ist möglich zu:

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

Vielen Dank im Voraus für jede Hilfe: D

56
travega

Es ist sehr wichtig zu verstehen, wie die Computerzeit funktioniert. Damit stimme ich zu, dass, wenn eine API erstellt wird, die Ihnen hilft, die Computerzeit wie in Echtzeit zu verarbeiten, diese so funktionieren sollte, dass Sie sie wie in Echtzeit behandeln können. Meistens ist dies der Fall, aber es gibt einige große Versäumnisse, die Aufmerksamkeit erfordern.

Wie auch immer, ich schweife ab !! Wenn Sie über einen UTC-Offset verfügen (besser in UTC als mit GMT-Offsets arbeiten), können Sie die Zeit in Millisekunden berechnen und Ihrem Zeitstempel hinzufügen. Beachten Sie, dass ein SQL-Zeitstempel von einem Java-Zeitstempel abweichen kann, da die Berechnung des Ablaufs aus der Epoche nicht immer gleich ist - abhängig von Datenbanktechnologien und auch von Betriebssystemen.

Ich empfehle Ihnen, System.currentTimeMillis () als Zeitstempel zu verwenden, da diese in Java konsistenter verarbeitet werden können, ohne sich um die Konvertierung von SQL-Zeitstempeln in Java-Datumsobjekte usw. kümmern 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!

28
user726478

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()));
35
Charleston

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

Die Grundidee ist, dass alles unter der Haube in Millisekunden in UTC seit der Epoche durchgeführt wird. Dies ist am einfachsten, wenn Sie ganz ohne Zeitzonen arbeiten, mit Ausnahme der String-Formatierung für den Benutzer.

Daher würde ich die meisten Schritte, die Sie vorgeschlagen haben, ü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. Rückgabe eines Strings vom Formatierer.

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

22
Bringer128

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 alte Datums-/Uhrzeit-Klassen aus den frühesten Java-Versionen. Diese alten Klassen haben sich als störend und verwirrend erwiesen. Vermeide sie. Verwenden Sie stattdessen die Java.time-Klassen.

ISO 8601

Ihre Eingabezeichenfolge entspricht nahezu dem Standardformat ISO 8601. Ersetzen Sie einfach den SPACE in der Mitte durch ein T

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

LocalDateTime

Analysieren Sie jetzt als LocalDateTime , da der Eingabe keine Informationen zu UTC-Versatz oder Zeitzone fehlen. Ein LocalDateTime hat keine Vorstellung von Versatz oder Zeitzone, so dass nicht einen tatsächlichen Moment auf der Timeline darstellt.

LocalDateTime ldt = LocalDateTime.parse( input );

ZoneOffset

Sie scheinen zu sagen, dass Sie aus dem geschäftlichen Kontext wissen, dass die Absicht dieser Zeichenfolge darin besteht, einen Moment darzustellen, der 13 Stunden vor UTC liegt. Also instanziieren wir ein 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 OffsetDateTime -Objekt zu erhalten. Dies wird zu einem tatsächlichen Moment auf der Zeitleiste.

OffsetDateTime odt = ldt.atOffset( offset);

ZoneId

Aber dann erwähnen Sie Neuseeland. Sie hatten also eine bestimmte Zeitzone im Auge. Eine Zeitzone ist ein Offset von UTC plus eine Reihe von Regeln für die Behandlung von Anomalien wie z. B. Sommerzeit. Wir können also ein ZoneId zu einem ZonedDateTime und nicht nur einen Offset angeben. 

Geben Sie einen richtigen Zeitzonennamen an. Verwenden Sie niemals die Abkürzung für 3-4 Buchstaben wie EST oder IST, da es sich nicht um echte Zeitzonen handelt, nicht standardisiert und nicht einmal eindeutig (!). Zum Beispiel Pacific/Auckland.

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

ZonedDateTime

Übernehmen Sie die ZoneId.

ZonedDateTime zdt = ldt.atZone( z );

Sie können sich für den gleichen Moment auf der Timeline problemlos in eine andere Zone einstellen.

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

Graf aus der Epoche

Ich empfehle dringend die Verwendung von Datum-Uhrzeit-Werten als Zählung aus der Epoche, z. B. Millisekunden ab Anfang 1970 UTC. Wenn Sie müssen, erstellen Sie aus einer solchen Nummer ein Instant.

Instant instant = Instant.ofEpochMilli( 1_317_816_735_000L );

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

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

Ihr Wert für 1_317_816_735_000L lautet:

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

Strings generieren

Um einen String im Standardformat ISO 8601 zu generieren, rufen Sie einfach toString auf. Beachten Sie, dass ZonedDateTime das Standardformat sinnvoll erweitert, indem Sie den Namen der Zeitzone in eckigen Klammern anhängen.

String output = zdt.toString();

Suchen Sie für andere Formate nach Stack Overflow nach der Klasse DateTimeFormatter . Schon oft abgedeckt. 

Geben Sie ein FormatStyle und ein Locale an.

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 für das Gebietsschema hat. Sie können einen Europe/Paris Datum/Uhrzeit in japanischer Sprache und kulturelle Normen anzeigen lassen, oder einen Asia/Kolkata Datum/Uhrzeit in portugiesischer Sprache und brasilianische Kulturnormen anzeigen lassen.

Über Java.time

Das Java.time - Framework ist in Java 8 und höher integriert. Diese Klassen ersetzen die störenden alten Datums-/Uhrzeit-Klassen wie Java.util.Date, .Calendar und & Java.text.SimpleDateFormat

Das Projekt Joda-Time , jetzt im Wartungsmodus , empfiehlt die Migration zu Java.time.

Weitere Informationen finden Sie im Oracle Tutorial . In Stack Overflow finden Sie viele Beispiele und Erklärungen.

Ein Großteil der Java.time-Funktionalität wird in ThreeTen-Backport auf Java 6 & 7 zurückportiert und darüber hinaus an Android in ThreeTenABP angepasst (siehe Verwendung…). ).

Das Projekt ThreeTen-Extra erweitert Java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Erweiterungen von Java.time. Hier finden Sie einige nützliche Klassen wie Interval, YearWeek, YearQuarter und mehr.

13
Basil Bourque

Die Lösung ist eigentlich recht 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
4
J S Raggio

Habe mal nachgesehen und ich glaube nicht, dass es in Java eine Zeitzone gibt, die GMT + 13 ist. 

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 zweite Codezeile.)

OR

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);
4
Craig

Joda-Zeit

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

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

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

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

Wenn Sie statt eines Leerzeichens eine T in die Mitte Ihrer Zeichenfolge gesetzt hätten, könnten Sie die ersten beiden Codezeilen überspringen und ein Formatierungsprogramm verwenden, 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 );

Wann 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
Basil Bourque

Wir können damit umgehen, indem wir einen Offset-Wert 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-Ausschnitt:

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

Ausgabe: 1387353270742 1387335270742

1
DeepaGanesh

Ich möchte die moderne Antwort geben.

Sie sollten Datum und Uhrzeit nicht wirklich von einer Zeichenfolge mit einem GMT-Versatz in eine Zeichenfolge mit einem anderen GMT-Versatz und in einem anderen Format konvertieren möchten. Halten Sie in Ihrem Programm eher einen Zeitpunkt als ein geeignetes Datum-Zeit-Objekt. Formatieren Sie Ihr Objekt nur dann in die gewünschte Zeichenfolge, wenn Sie eine Zeichenfolgenausgabe benötigen.

Java.time

Parsing-Eingabe

    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 ist Instant eine gute Wahl zum Speichern eines Zeitpunkts. Wenn Sie explizit angeben möchten, dass Datum und Uhrzeit von GMT stammen, verwenden Sie stattdessen ein OffsetDateTime.

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);

Dieser druckte:

06 Okt 2011 16:35:05 GMT + 13: 00

Ich habe die Zeitzone Pacific/Auckland angegeben und nicht den von Ihnen angegebenen Versatz von +13: 00. 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 Ihrem eigenen Code nicht berücksichtigen müssen (für die meisten Zwecke).

Da Oct auf Englisch ist, ist es eine gute Idee, dem Formatierer ein explizites Gebietsschema zuzuweisen. GMT ist möglicherweise auch lokalisiert, aber ich denke, es wird nur GMT in allen Ländereinstellungen gedruckt.

OOOO in der Formatmusterzeichenfolge ist eine Möglichkeit zum Drucken des Offsets. Dies ist möglicherweise eine bessere Idee als das Drucken der Zeitzonenabkürzung, die Sie von z erhalten würden, da Zeitzonenabkürzungen häufig nicht eindeutig sind. Wenn Sie NZDT (für die neuseeländische Sommerzeit) möchten, platzieren Sie z stattdessen dort.

Ihre Fragen

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

Ist möglich zu:

  1. Stellen Sie die Uhrzeit 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 aufweist (dies hat eine Reihe von Vorteilen, einschließlich der Threadsicherheit).

  1. (Möglicherweise) Legen Sie die Zeitzone des ursprünglichen Zeitstempels fest

Die atZone -Methode, die ich im Code verwende, gibt ein ZonedDateTime mit der angegebenen Zeitzone zurück. Andere Datums-/Uhrzeitklassen haben eine ähnliche Methode, die manchmal als atZoneSameInstant oder als andere Namen bezeichnet wird.

  1. Formatieren Sie den Zeitstempel mit einer neuen Zeitzone

Mit Java.time sind die Konvertierung in eine neue Zeitzone und die Formatierung zwei verschiedene Schritte, wie gezeigt.

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

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

Ich habe festgestellt, dass ich die Zeit immer so einstellen möchte:

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

die TimeZone des lokalen Computers wird verwendet. Warum das?

Es ist nicht so, wie Sie denken, was nur ein paar der (vielen) Designprobleme mit den alten Klassen verdeutlicht.

  • Ein Date hat keine Zeitzone. Nur wenn Sie es drucken, erfasst die Methode toString Ihre lokale Zeitzone und verwendet sie zum Rendern der Zeichenfolge. Dies gilt auch für new Date(). Dieses Verhalten hat in den letzten 25 Jahren viele, viele Programmierer verwirrt.
  • Ein Calender hat eine Zeitzone. Es ändert sich nicht, wenn Sie calendar.setTime(new Date(1317816735000L)); ausführen.

Verknüpfung

Oracle Tutorial: Date Time Erklären der Verwendung von Java.time.

1
Ole V.V.

Um die Dauer oder das Zeitintervall mit zwei verschiedenen Zeitzonen zu finden

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
Abhishek Singha

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

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 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
1
Pratik
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;
}
0
Sourav Barman

Wir können den UTC/GMT-Zeitstempel vom angegebenen Datum abrufen.

/**
 * 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;

}

Es wird die UTC-Zeit basierend auf dem vergangenen Datum zurückgegeben.

  • Wir können wie UTC-Zeitstempel 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 hilft anderen. Vielen Dank!!

0
jagdish

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()));
0
augurar

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

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

0
Ev.