Pregunta

Tengo mi aplicación alojada en un servidor de Londres. Estoy en Madrid, España. Por lo que la zona horaria es de -2 horas.

¿Cómo puedo obtener la fecha / hora actual con mi zona de tiempo.

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

por ejemplo.

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

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();
¿Fue útil?

Solución

Date es siempre basada en UTC ... o el tiempo-zona neutral, dependiendo de cómo desea verlo. Un Date solamente representa un punto en el tiempo; es independiente de la zona horaria, sólo un número de milisegundos desde la época Unix. No hay noción de una "instancia local de Date." Utilice Date en conjunción con Calendar y / o TimeZone.getDefault() utilizar un " "zona horaria local. Utilice TimeZone.getTimeZone("Europe/Madrid") para obtener la zona horaria de Madrid.

... o usar Joda Time , que tiende a hacer que todo sea más clara, la OMI. En Joda Time tendrá que utilizar un valor DateTime, que es un instante en el tiempo en un sistema de calendario en particular y la zona horaria .

En Java 8 tendrá que utilizar java.time.ZonedDateTime, que es el equivalente de Java 8 DateTime de Joda Time.

Otros consejos

Como ya se dijo Jon Skeet, java.util.Date no tiene una zona horaria. Un objeto Date representa un número de milisegundos desde el 1 de enero de 1970, 12:00a.m., UTC. No contiene información de zona horaria.

Cuando se formatea un objeto Date en una cadena, por ejemplo mediante el uso de SimpleDateFormat, entonces se puede establecer la zona horaria en el objeto DateFormat para hacerle saber en qué zona horaria que desea mostrar la fecha y la hora:

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 desea que la zona horaria local del ordenador que el programa se está ejecutando en, utilice:

df.setTimeZone(TimeZone.getDefault());

Calendario es simple:

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

Con el java.time clases integradas en Java 8 y versiones posteriores:

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]
    }

Comprobar esto puede ser útil. Funciona bien para mí. Código también cubiertas de verano

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

JodaTime para eso. Java.util.Date es muy limitada con respecto a la zona horaria.

No pude conseguir que funcione utilizando el Calendario. Usted tiene que utilizar 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());

Aquí es un ejemplo:

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

Aquí hay algunos pasos para encontrar tiempo para su zona:

Fecha ahora = 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));  
DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);
df.setTimeZone(TimeZone.getTimeZone("PST"));
final String dateTimeString = df.format(new Date());
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top