web-dev-qa-db-fra.com

Convertir date/heure pour un fuseau horaire donné - java

Je souhaite convertir cet horodatage GMT en GMT + 13:

2011-10-06 03:35:05

J'ai essayé environ 100 combinaisons différentes de DateFormat, TimeZone, Date, GregorianCalendar etc. pour essayer de faire cette tâche TRÈS basique.

Ce code fait ce que je veux pour le moment actuel:

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

Mais ce que je veux, c'est régler l'heure plutôt que d'utiliser l'heure actuelle. 

J'ai trouvé que chaque fois que j'essaie de régler l'heure comme ceci:

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

le fuseau horaire de la machine locale est utilisé. Pourquoi donc? Je sais que lorsque "new Date ()" renvoie l'heure UTC + 0, pourquoi dès lors que vous définissez l'heure en millisecondes, ne supposez-vous plus que l'heure est en UTC?

Est-il possible de:

  1. Définir l'heure d'un objet (Calendrier/Date/Horodatage)
  2. (Eventuellement) Définir le fuseau horaire de l'horodatage initial (calendar.setTimeZone (...))
  3. Formatez l'horodatage avec une nouvelle TimeZone (formatter.setTimeZone (...)))
  4. Renvoie une chaîne avec le nouveau fuseau horaire. (formatter.format (calendar.getTime ()))

Merci d'avance pour toute aide: D

56
travega

Comprendre le fonctionnement du temps-ordinateur est très important. Cela dit, je suis d’accord pour dire que si une API est créée pour vous aider à traiter votre temps d’ordinateur comme en temps réel, il devrait fonctionner de manière à vous permettre de le traiter en temps réel. C'est en grande partie le cas, mais il y a des lacunes importantes qui nécessitent une attention particulière.

En tout cas je m'égare !! Si vous avez votre décalage UTC (il est préférable de travailler en UTC que les décalages GMT), vous pouvez calculer le temps en millisecondes et l'ajouter à votre horodatage. Notez qu'un horodatage SQL peut différer d'un horodatage Java, car le calcul de la durée écoulée depuis l'époque ne dépend pas toujours des mêmes technologies, en fonction des technologies de base de données et des systèmes d'exploitation.

Je vous conseillerais d'utiliser System.currentTimeMillis () comme horodatage, car ceux-ci peuvent être traités de manière plus cohérente en Java sans vous soucier de la conversion des horodatages SQL en objets Date Java, etc.

Pour calculer votre décalage, vous pouvez essayer quelque chose comme ceci:

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

J'espère que ceci est utile!

28
user726478

Pour moi, le moyen le plus simple de le faire est:

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

Comme toujours, je vous recommande de lire cet article à propos de la date et de l’heure en Java afin de bien la comprendre.

L'idée de base est que «sous le capot», tout se fait en millisecondes UTC depuis l'époque. Cela signifie que c'est plus facile si vous n'utilisez pas de fuseaux horaires, à l'exception du formatage de chaîne pour l'utilisateur.

Par conséquent, je sauterais la plupart des étapes que vous avez suggérées.

  1. Définissez l'heure sur un objet (Date, Calendrier, etc.).
  2. Définissez le fuseau horaire sur un objet de formatage.
  3. Renvoie une chaîne du formateur.

Alternativement, vous pouvez utiliser Joda time . J'ai entendu dire qu'il s'agit d'une API datetime beaucoup plus intuitive.

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

…également…

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

Java.time

La question et la plupart des réponses utilisent des classes de date/heure héritées des anciennes versions de Java. Ces anciennes classes se sont avérées gênantes et déroutantes. Évite-les. Utilisez plutôt les classes Java.time.

ISO 8601

Votre chaîne de saisie est presque au format ISO 8601. Il suffit de remplacer l’ESPACE au milieu par un T

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

LocalDateTime

Analysons maintenant comme un LocalDateTime parce que l’entrée ne contient aucune information sur le décalage horaire par rapport à UTC ou le fuseau horaire. Une LocalDateTime n'a pas de concept de décalage ni de fuseau horaire, elle ne ne représente donc pas un moment réel sur la timeline.

LocalDateTime ldt = LocalDateTime.parse( input );

ZoneOffset

Vous semblez dire que, dans le contexte commercial, vous savez que l'intention de cette chaîne est de représenter un moment qui a 13 heures d'avance sur UTC. Nous instancions donc un ZoneOffset .

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

OffsetDateTime

Appliquez-le pour obtenir un objet OffsetDateTime . Cela devient un moment réel sur la timeline.

OffsetDateTime odt = ldt.atOffset( offset);

ZoneId

Mais ensuite, vous parlez de la Nouvelle-Zélande. Donc, vous aviez un fuseau horaire spécifique à l’esprit. Un fuseau horaire est un ensemble de règles de traitement des anomalies, telles que l'heure d'été (DST), par rapport à l'heure UTC plus. Nous pouvons donc spécifier une variable ZoneId à une variable ZonedDateTime plutôt qu'un simple décalage. 

Spécifiez un nom de fuseau horaire approprié . N'utilisez jamais les abréviations de 3-4 lettres telles que EST ou IST car elles ne sont pas de vrais fuseaux horaires, ni normalisées, ni même uniques (!). Par exemple, Pacific/Auckland.

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

ZonedDateTime

Appliquez la ZoneId.

ZonedDateTime zdt = ldt.atZone( z );

Vous pouvez facilement vous ajuster dans une autre zone pour le même moment sur la timeline.

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

Comptez d'époque

Je déconseille fortement de traiter les valeurs de date-heure en tant que nombre depuis Epoch, telles que les millisecondes à partir du début de 1970 UTC. Mais si vous devez, créez une Instant à partir d'un tel nombre.

Instant instant = Instant.ofEpochMilli( 1_317_816_735_000L );

Attribuez ensuite un fuseau horaire comme indiqué ci-dessus, si vous le souhaitez, pour vous éloigner de l'UTC.

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

Votre valeur de 1_317_816_735_000L est:

  • 2011-10-05T12:12:15Z (mer., 05 oct. 2011 12:12:15 GMT)
  • 2011-10-06T01:12:15+13:00[Pacific/Auckland] (jeudi 06 octobre 2011 à 01:12 à Auckland en Nouvelle-Zélande).

Générer des chaînes

Pour générer une chaîne au format standard ISO 8601 , appelez simplement toString. Notez que ZonedDateTime étend judicieusement le format standard en ajoutant le nom du fuseau horaire entre crochets.

String output = zdt.toString();

Pour les autres formats, recherchez Stack Overflow pour la classe DateTimeFormatter . Déjà couvert plusieurs fois. 

Spécifiez un FormatStyle et un Locale .

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

Notez que le fuseau horaire n'a rien à voir avec les paramètres régionaux. Vous pouvez afficher Europe/Paris date-heure en normes de langue et de culture japonaises ou Asia/Kolkata date-heure en langues portugaise et normes culturelles du Brésil.

À propos de Java.time

Le cadre Java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciennes classes de date-heure problématiques telles que Java.util.Date, .Calendar et Java.text.SimpleDateFormat

Le projet Joda-Time , désormais en mode mode de maintenance , conseille la migration vers Java.time.

Pour en savoir plus, consultez le Tutoriel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications.

Une grande partie de la fonctionnalité Java.time est rétroportée vers Java 6 et 7 sous ThreeTen-Backport et ensuite adaptée à Android dans ThreeTenABP _ (voir Comment utiliser… ).

Le projet ThreeTen-Extra étend Java.time avec des classes supplémentaires. Ce projet est un terrain d’essai pour d’éventuels ajouts à Java.time. Vous pouvez y trouver des classes utiles telles que Interval, YearWeek, YearQuarter et plus.

13
Basil Bourque

La solution est en fait assez simple (Java pur et simple):

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

LA SORTIE EST:

 NZ Local Time: 2011-10-06 03:35:05
UTC Local Time: 2011-10-05 14:35:05
4
J S Raggio

J’ai jeté un coup d’œil et je ne pense pas qu’il y ait un fuseau horaire GMT + 13 en Java. 

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

(S'il y a lieu, remplacez "GMT" par ce fuseau horaire et supprimez la deuxième ligne de code)

OR

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

Si vous souhaitez définir une heure/date spécifique, vous pouvez également utiliser:

    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-Time

Les classes Java.util.Date/Calendar sont un désordre et doivent être évitées.

Mise à jour: le projet Joda-Time est en mode maintenance. L'équipe conseille la migration vers les classes Java.time.

Voici votre réponse en utilisant la bibliothèque Joda-Time 2.3. Très facile.

Comme indiqué dans l'exemple de code, je vous suggère d'utiliser des fuseaux horaires nommés chaque fois que cela est possible afin que votre programmation puisse traiter Heure d'été (DST) et d'autres anomalies.

Si vous aviez placé une T au milieu de votre chaîne au lieu d'un espace, vous pouvez ignorer les deux premières lignes de code, avec un formateur pour analyser la chaîne. Le constructeur DateTime peut prendre une chaîne au format ISO 8601 .

// © 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 de ces valeurs…

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

Quand couru…

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

Nous pouvons gérer cela en utilisant la valeur de décalage

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

Extrait de code de test:

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

Sortie: 1387353270742 1387335270742

1
DeepaGanesh

Je voudrais apporter la réponse moderne.

Vous ne devriez pas vraiment vouloir convertir une date et une heure d'une chaîne à un décalage GMT en une chaîne à un décalage GMT différent et dans un format différent. Dans votre programme, gardez plutôt un instant (un point dans le temps) comme objet date-heure approprié. Formatez votre objet dans la chaîne souhaitée uniquement lorsque vous devez fournir une sortie chaîne.

Java.time

Analyse de l'entrée

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

Dans la plupart des cas, Instant est un bon choix pour stocker un point dans le temps. Si vous deviez indiquer explicitement que la date et l'heure provenaient de GMT, utilisez plutôt un OffsetDateTime.

Conversion, formatage et impression des résultats

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

Ce imprimé:

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

J'ai spécifié le fuseau horaire Pacific/Auckland plutôt que le décalage que vous avez mentionné, +13: 00. J'ai compris que vous vouliez l'heure de la Nouvelle-Zélande, et Pacific/Auckland le dit mieux au lecteur. Le fuseau horaire prend également en compte l’heure d’été (heure avancée de l’été). Vous n’avez donc pas besoin de la prendre en compte dans votre propre code (dans la plupart des cas).

Comme Oct est en anglais, c’est une bonne idée de donner au formateur des paramètres régionaux explicites. GMT est peut-être localisé aussi, mais je pense qu'il imprime simplement GMT dans tous les paramètres régionaux.

OOOO dans la chaîne de modèles de format est une façon d’imprimer le décalage, ce qui peut être une meilleure idée que d’imprimer l’abréviation de fuseau horaire que vous obtiendrez de z car les abréviations de fuseau horaire sont souvent ambiguës. Si vous voulez NZDT (pour l'heure avancée de la Nouvelle-Zélande), il vous suffit d'y placer z.

Vos questions

Je répondrai à vos questions numérotées en relation avec les classes modernes en Java.time.

Est-il possible de:

  1. Définir l'heure sur un objet

Non, les classes modernes sont immuables. Vous devez créer un objet avec la date et l'heure souhaitées dès le départ (cela présente de nombreux avantages, notamment la sécurité des threads).

  1. (Éventuellement) Définir le fuseau horaire de l'horodatage initial

La méthode atZone que j'utilise dans le code renvoie un ZonedDateTime avec le fuseau horaire spécifié. D'autres classes date-heure ont une méthode similaire, parfois appelée atZoneSameInstant ou d'autres noms.

  1. Formater l'horodatage avec un nouveau fuseau horaire

Avec Java.time, la conversion en un nouveau fuseau horaire et la mise en forme sont deux étapes distinctes, comme indiqué.

  1. Renvoie une chaîne avec le nouveau fuseau horaire.

Oui, convertissez le fuseau horaire souhaité comme indiqué et formatez-le comme indiqué.

J'ai trouvé que chaque fois que j'essaie de régler l'heure comme ceci:

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

le fuseau horaire de la machine locale est utilisé. Pourquoi donc?

Ce n’est pas ce que vous pensez, ce qui montre bien quelques-uns des nombreux problèmes de conception rencontrés avec les anciennes classes.

  • Un Date n'a pas de fuseau horaire. Ce n’est que lorsque vous l’imprimez que sa méthode toString saisit votre fuseau horaire local et l’utilise pour restituer la chaîne. Ceci est vrai pour new Date() aussi. Ce comportement a dérouté de nombreux programmeurs au cours des 25 dernières années.
  • Une Calender a un fuseau horaire. Cela ne change pas lorsque vous faites calendar.setTime(new Date(1317816735000L));.

Lien

tutoriel Oracle: Date Time expliquant comment utiliser Java.time.

1
Ole V.V.

Pour rechercher une durée ou un intervalle de temps avec deux fuseaux horaires différents

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

période de sortie = P117DT13H40M

days = 117
minutes = 40
hours = 13
1
Abhishek Singha

afficher la date et l'heure pour tous les fuseaux horaires

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
Krzysztof Dziuba

J'ai essayer ce code 

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

et obtenir ce résultat

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

Nous pouvons obtenir l'horodatage UTC/GMT à partir de la date indiquée.

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

}

Il retournera l'heure UTC en fonction de la date passée.

  • Nous pouvons inverser l’horodatage UTC avec la date et l’heure actuelles 

        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 "";  
                }
    

J'espère que cela aidera les autres. Merci!!

0
jagdish

Votre approche fonctionne sans aucune modification.

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

Un moyen rapide est:

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

Sortie

NOUVELLE DATE: 2015-07-02T16: 51: 46

0
Ev.