web-dev-qa-db-fra.com

Comment obtenir la date et l'heure actuelles de votre fuseau horaire en Java?

J'ai mon application hébergée sur un serveur London. Je suis à Madrid en Espagne. Donc, le fuseau horaire est -2 heures. 

Comment puis-je obtenir la date/heure actuelle avec mon fuseau horaire.

Date curr_date = new Date(System.currentTimeMillis());

par exemple. 

Date curr_date = new Date(System.currentTimeMillis("MAD_TIMEZONE"));

Avec Joda-Time

DateTimeZone zone = DateTimeZone.forID("Europe/Madrid");
DateTime dt = new DateTime(zone);
int day = dt.getDayOfMonth();
int year = dt.getYear();
int month = dt.getMonthOfYear();
int hours = dt.getHourOfDay();
int minutes = dt.getMinuteOfHour();
46
Sergio del Amo

Date est toujours En fonction du temps UTC ... ou du fuseau horaire neutre, selon le mode d'affichage souhaité. Un Dateonly représente un instant donné; il est indépendant du fuseau horaire, seulement quelques millisecondes depuis l’époque Unix. Il n'y a aucune notion d'une "instance locale de Date." Utilisez Date avec Calendar et/ou TimeZone.getDefault() pour utiliser un fuseau horaire "local". Utilisez TimeZone.getTimeZone("Europe/Madrid") pour obtenir le fuseau horaire de Madrid.

... ou utilisez Joda Time , qui a tendance à rendre le tout plus clair, IMO. Dans Joda Time, vous utiliseriez une valeur DateTime, qui correspond à un instant dans le temps dans un système de calendrier et un fuseau horaire particuliers.

En Java 8, vous utiliseriez Java.time.ZonedDateTime, qui est l'équivalent Java 8 de DateTime de Joda Time.

83
Jon Skeet

Comme Jon Skeet l'a déjà dit, Java.util.Date n'a pas de fuseau horaire. Un objet Date représente un nombre de millisecondes depuis le 1er janvier 1970 à 00h00, heure UTC. Il ne contient pas d'informations de fuseau horaire.

Lorsque vous formatez un objet Date en chaîne, par exemple à l'aide de SimpleDateFormat, vous pouvez définir le fuseau horaire de l'objet DateFormat pour lui indiquer dans quel fuseau horaire vous souhaitez afficher la date et l'heure:

Date date = new Date();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

// Use Madrid's time zone to format the date in
df.setTimeZone(TimeZone.getTimeZone("Europe/Madrid"));

System.out.println("Date and time in Madrid: " + df.format(date));

Si vous voulez le fuseau horaire local de l'ordinateur sur lequel votre programme est exécuté, utilisez:

df.setTimeZone(TimeZone.getDefault());
49
Jesper

utiliser Calendrier est simple:

Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("Europe/Madrid"));
Date currentDate = calendar.getTime();
16
dfa

Avec les classes Java.time intégrées à Java 8 et versions ultérieures:

public static void main(String[] args) {
        LocalDateTime localNow = LocalDateTime.now(TimeZone.getTimeZone("Europe/Madrid").toZoneId());
        System.out.println(localNow);
        // Prints current time of given zone without zone information : 2016-04-28T15:41:17.611
        ZonedDateTime zoneNow = ZonedDateTime.now(TimeZone.getTimeZone("Europe/Madrid").toZoneId());
        System.out.println(zoneNow);
        // Prints current time of given zone with zone information : 2016-04-28T15:41:17.627+02:00[Europe/Madrid]
    }
4
Zeeshan

Vérifiez que cela peut être utile. Travaille bien pour moi. Le code couvre également l'heure d'été

              TimeZone tz = TimeZone.getTimeZone("Asia/Shanghai");
    Calendar cal = Calendar.getInstance();      
    // If needed in hours rather than milliseconds
    int LocalOffSethrs = (int) ((cal.getTimeZone().getRawOffset()) *(2.77777778 /10000000));        
    int ChinaOffSethrs = (int) ((tz.getRawOffset()) *(2.77777778 /10000000));       
    int dts = cal.getTimeZone().getDSTSavings();
    System.out.println("Local Time Zone : " + cal.getTimeZone().getDisplayName());
    System.out.println("Local Day Light Time Saving : " + dts);
    System.out.println("China Time : " + tz.getRawOffset());
    System.out.println("Local Offset Time from GMT: " + LocalOffSethrs);
    System.out.println("China Offset Time from GMT: " + ChinaOffSethrs);    
    // Adjust to GMT
    cal.add(Calendar.MILLISECOND,-(cal.getTimeZone().getRawOffset()));  
    // Adjust to Daylight Savings
    cal.add(Calendar.MILLISECOND, - cal.getTimeZone().getDSTSavings());
    // Adjust to Offset
    cal.add(Calendar.MILLISECOND, tz.getRawOffset());       
    Date dt = new Date(cal.getTimeInMillis());              
    System.out.println("After adjusting offset Acctual China Time :" + dt); 
3
Subhamay

Vous utiliseriez JodaTime pour cela. Java.util.Date est très limité en ce qui concerne TimeZone.

2
Joshua Partogi

Je ne pouvais pas le faire fonctionner avec Calendar. Vous devez utiliser DateFormat

//Wednesday, July 20, 2011 3:54:44 PM PDT
DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);
df.setTimeZone(TimeZone.getTimeZone("PST"));
final String dateTimeString = df.format(new Date());

//Wednesday, July 20, 2011
df = DateFormat.getDateInstance(DateFormat.FULL);
df.setTimeZone(TimeZone.getTimeZone("PST"));
final String dateString = df.format(new Date());

//3:54:44 PM PDT
df = DateFormat.getTimeInstance(DateFormat.FULL);
df.setTimeZone(Timezone.getTimeZone("PST"));
final String timeString = df.format(new Date());
1
wjin

Voici un exemple:

Calendar c = Calendar.getInstance(TimeZone.getDefault());
Date date = c.getTime();
0
Martijn Courteaux

Voici quelques étapes pour trouver du temps pour votre zone:

Date now = new Date (); 

 DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");  
 df.setTimeZone(TimeZone.getTimeZone("Europe/London"));  

 System.out.println("timeZone.......-->>>>>>"+df.format(now));  
0
shan