web-dev-qa-db-fra.com

comment obtenir le fuseau horaire du client en Java à partir de HttpServletRequest?

Lorsque le serveur et le client sont dans des fuseaux horaires différents, puis-je obtenir le fuseau horaire du client en Java à l'aide de HttpServletRequest?

J'essaie de créer une instance de 'Calender' en utilisant 'Locale' du client comme ceci,

Calendar calendar = Calendar.getInstance(request.getLocale());
TimeZone clientTimeZone = calendar.getTimeZone();

Mais cela ne me donne que le fuseau horaire du serveur.

Cette méthode est-elle erronée? Existe-t-il un autre moyen d’obtenir le fuseau horaire du client dans Server?

11
Noor Khan

Malheureusement, les informations de fuseau horaire ne sont pas passées dans HTTP request.

Mais il y a un travail autour de ce cas.

Vérifiez this answer et this one. cela peut vous aider.

7
Salah

il existe deux manières d'obtenir le fuseau horaire du navigateur à partir de l'objet request.

  1. lorsque vous faites une demande depuis le navigateur, ajoutez un paramètre pour demander un objet à l'aide de javascript. La commande ci-dessous donne le fuseau horaire du navigateur:

    Intl.DateTimeFormat().resolvedOptions().timeZone
    

en utilisant cette commande, vous obtiendrez une chaîne représentant l'exemple de fuseau horaire "Pacific/Fakaofo, Pacific/Honolulu". Vous pouvez obtenir ce fuseau horaire en dehors de l'objet de requête côté serveur à l'aide de 

String timezoneStr = request.getParameter("your_parameter_name");

passer cette chaîne à Timezone.getTimeZone (timezoneStr); retournera l'objet timezone pour l'heure du navigateur

  1. Une autre façon de procéder consiste à extraire le zoneOffset de la session de demande. La session contient la valeur zoneOffset sous forme entière dont vous avez besoin pour obtenir votre heure GMT. ci-dessous est l'échantillon:

    public static String getGMTSignedZone(HttpServletRequest request)
    {
    String zoneOffset;
    HttpSession session = request.getSession();
    zoneOffset = (String)session.getAttribute("timezone");
    if(zoneOffset != null && !zoneOffset.equals(""))
    {
        Integer zMinutes = Integer.valueOf(zoneOffset);
        String sign = (zMinutes < 0) ? "+" : "-";
        String hourString;
        String minString;
        if(zMinutes < 0)
        {
            zMinutes = zMinutes*(-1);
        }
    
        // hours 0 to 23
        int hours = zMinutes/60;
        if(hours > 23)
        {
            hours = hours/24;
        }
        if(hours < 10)
        {
            hourString = "0" + hours;
        }
        else
        {
            hourString = "" + hours;
        }
        //minute conversion
        int minutes = zMinutes - (hours*60);
        if(minutes < 10)
        {
            minString = "0" + minutes;
        }
        else
        {
            minString = "" + minutes;
        }
        return ("GMT" + sign + hourString + minString);
    }
    return zoneOffset;
    }
    

le retour de ce qui précède peut être facilement converti en fuseau horaire en utilisant le code ci-dessous:

    StringBuffer buffer = new StringBuffer("");
    int absOffset = Math.abs(offset);
    int hrs = absOffset/60;
    int mins = absOffset%60;
    buffer.append("GMT").append(offset > 0 ? "-" : "+").append(hrs < 10 ? "0" : "").append(hrs).append(":").append(mins < 10 ? "0" : "").append(mins);
    String tzID = buffer.toString();
    TimeZone tz = TimeZone.getTimeZone(tzID);

utilisez l'une de ces méthodes pour obtenir le fuseau horaire et convertir votre objet calandre en fuseau horaire défini.

les deux méthodes ne requièrent aucun code côté client, mais beaucoup de validation côté serveur, et la première approche nécessite de petites modifications côté client et de petites modifications côté serveur. C'est à vous de choisir ce que vous préférez. 

0
Kushagra Misra