web-dev-qa-db-fra.com

Obtenir la date dans le fuseau horaire actuel en java

Depuis quelques heures, je cherche sur le net pour obtenir la date et l’heure dans le fuseau horaire de mon système.

Lorsque j'utilise calendar.getTimezone.getDefaultName, il me renvoie toujours l'heure GMT. (idéalement, mon fuseau horaire actuel doit être renvoyé, qui est IST) J'essaie de convertir cette chaîne "2014-02-14T06: 04: 00: 00", qui est en GMT en mon fuseau horaire datetime ..__ me renvoie toujours le même temps en GMT.

Tout ce que je vois, c'est que tout le monde suggère d'utiliser le fuseau horaire. c'est à dire, 

dateFormatter.setTimezone("any_arbitary_timezone");

Point is my application sera utilisé dans différents endroits géographiques. Je ne peux pas le définir sur un fuseau horaire particulier. Il doit être défini sur le fuseau horaire du système, de sorte qu'il puisse s'afficher dans le fuseau horaire de l'utilisateur.

22
Kiran Kulkarni

Voici un moyen d'obtenir l'id d'une TimeZone qui correspond au décalage de l'horloge de votre système local,

Calendar cal = Calendar.getInstance();
long milliDiff = cal.get(Calendar.ZONE_OFFSET);
// Got local offset, now loop through available timezone id(s).
String [] ids = TimeZone.getAvailableIDs();
String name = null;
for (String id : ids) {
  TimeZone tz = TimeZone.getTimeZone(id);
  if (tz.getRawOffset() == milliDiff) {
    // Found a match.
    name = id;
    break;
  }
}
System.out.println(name);
9
Elliott Frisch

Je crois que ce que vous cherchez, c'est la Joda bibliothèque. Il a une fonctionnalité meilleure que les classes Calendar ou Date comme spécifié dans la réponse ici

Cette fonction devrait être particulièrement utile.

0
BCza
      private String receivedFormat = "yyyy-MM-dd'T'HH:mm:ss", expectedFormat = "dd-MM-yyyy HH:mm:ss"; //Globall variables

        //Write these three lines in your Test Class and below 2 methods

        String dateString = "2018-08-14T07:00:00:00";
        String returnString = correctDateFormat(dateString, receivedFormat, expectedFormat);
        String result = getTimeInSelectedLocale(returnString);
    Log.i("Ayaz", "Date: " +result);



     /**
         * @param receivedDate
         * @param givenFormat
         * @param expectedFormat
         * @return returns date time in expected format
         */
        public static String correctDateFormat(String receivedDate, String givenFormat, String expectedFormat) {
            if (TextUtils.isEmpty(receivedDate)) {
                return "";
            }
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat(givenFormat);
            Date newDate = null;
            try {
                newDate = simpleDateFormat.parse(receivedDate);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            simpleDateFormat = new SimpleDateFormat(expectedFormat);
            receivedDate = simpleDateFormat.format(newDate);
            return receivedDate;
        }



        /**
         * @param dateString
         * @return passed string date in different locale, My Db is in IST so I an converting IST in different locale
         */
        public  String getTimeInSelectedLocale(String dateString) {
            if (TextUtils.isEmpty(dateString)) {
                return dateString;
            }
            SimpleDateFormat sdf = new SimpleDateFormat(expectedFormat);
            sdf.setTimeZone(TimeZone.getTimeZone("Asia/Kolkata")); //We want Indian time to change in different locale, so this line is compulsory, you can replace with your country
            Date date1 = null;
            try {
                date1 = sdf.parse(dateString);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            //below this line -> TimeZone.getTimeZone(TimeZone.getDefault().getID(), will return current locale for example for India "Asia/Kolkata" for UAE "Asia/Dubai"
            sdf.setTimeZone(TimeZone.getTimeZone(TimeZone.getDefault().getID())); //This line chooses current local in which you want time
            String localDate = sdf.format(date1);
            return localDate;
        }

//I am converting the IST time "2018-08-14T07:00:00:00"  into UAE(Duabai) "14-08-2018 05:30:00" and other countries
0
Ayaz