Java: ¿Cómo se puede convertir una marca de hora UTC hora local?

Tengo una marca de hora en hora UTC y la quiero convertir a hora local sin necesidad de utilizar una llamada a la API como TimeZone.getTimeZone("PST"). Cómo exactamente se supone que hay que hacer esto? He estado usando el siguiente código sin mucho éxito:

private static final SimpleDateFormat mSegmentStartTimeFormatter = new        SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");

Calendar calendar = Calendar.getInstance();

    try {
        calendar.setTime(mSegmentStartTimeFormatter.parse(startTime));
    }
    catch (ParseException e) {
        e.printStackTrace();
    }

    return calendar.getTimeInMillis();

De la muestra valor de entrada: [2012-08-15T22:56:02.038Z]

debe devolver el equivalente de [2012-08-15T15:56:02.038Z]

InformationsquelleAutor Android Noob | 2012-09-19

3 Kommentare

  1. 52

    Date no tiene zona horaria y almacena internamente en UTC. Sólo cuando la fecha es el formato es la zona horaria de corrección se aplica. Cuando se utiliza un DateFormat, el valor predeterminado es la zona horaria de la JVM de funcionamiento. Uso setTimeZone a cambiar según sea necesario.

    DateFormat utcFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
    utcFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
    
    Date date = utcFormat.parse("2012-08-15T22:56:02.038Z");
    
    DateFormat pstFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
    pstFormat.setTimeZone(TimeZone.getTimeZone("PST"));
    
    System.out.println(pstFormat.format(date));

    Esto imprime 2012-08-15T15:56:02.038

    Nota que me dejó fuera de los 'Z' en el formato PST como se indica UTC. Si fui con Z la salida sería 2012-08-15T15:56:02.038-0700

    • Genial es realmente trabajado. Yo era capaz de conseguir el dispositivo Android de la zona horaria por defecto llamando a la zona Horaria.getDefault().
    • no se trata de cambiar, que es la misma que la hora UTC, ¿qué puedo hacer ?
  2. 14

    El uso de la moderna Java fecha & de la API de tiempo, y esto es sencillo:

        String inputValue = "2012-08-15T22:56:02.038Z";
        Instant timestamp = Instant.parse(inputValue);
        ZonedDateTime losAngelesTime = timestamp.atZone(ZoneId.of("America/Los_Angeles"));
        System.out.println(losAngelesTime);

    Esto imprime

    2012-08-15T15:56:02.038-07:00[America/Los_Angeles]

    Puntos a tener en cuenta:

    • Hay un pequeño error en sus expectativas. El Z en su timestamp significa UTC, también conocido como hora Zulu. Así que en tu hora local de valor, la Z no deberían estar ahí. En lugar usted desea un valor de retorno, como por ejemplo 2012-08-15T15:56:02.038-07:00, ya que el desplazamiento es ahora -7 horas en lugar de Z.
    • Evitar el tres letras en el tiempo de la zona de abreviaturas. No están estandarizadas y, por tanto, más a menudo ambigua. PST, por ejemplo, puede significar Philppine Estándar de Tiempo, Hora Estándar del Pacífico o de Pitcairn de Tiempo Estándar (aunque S en una abreviatura es a menudo para la época de verano (sentido HORARIO). Si la intención de Hora Estándar del Pacífico, que no es ni siquiera una hora de la zona, ya que en verano (donde su marca de tiempo de la muestra cae) Hora de verano del Pacífico se utiliza en su lugar. En lugar de las abreviaturas de tiempo de uso de la zona de IDs en el formato de región/ciudad como en mi código.
    • Las marcas de tiempo son generalmente los mejores manejado como Instant objetos. Convertir a ZonedDateTime sólo cuando usted tiene una necesidad, como para la presentación.

    Pregunta: ¿puedo utilizar las modernas API con mi versión de Java?

    Si el uso de al menos Java 6, usted puede.

  3. -1

    Aquí es una Simple Modificación de la solución de

        public String convertToCurrentTimeZone(String Date) {
                String converted_date = "";
                try {
    
                    DateFormat utcFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    utcFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
    
                    Date date = utcFormat.parse(Date);
    
                    DateFormat currentTFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    currentTFormat.setTimeZone(TimeZone.getTimeZone(getCurrentTimeZone()));
    
                    converted_date =  currentTFormat.format(date);
                }catch (Exception e){ e.printStackTrace();}
    
                return converted_date;
        }
    
    
        //get the current time zone
    
        public String getCurrentTimeZone(){
                TimeZone tz = Calendar.getInstance().getTimeZone();
                System.out.println(tz.getDisplayName());
                return tz.getID();
        }
    • Esto devuelve la hora UTC, que quiero convertir a hora local!!!!
    • esto es convertir a hora local cerca del final del método…….

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea