¿Cómo obtener la fecha actual y la hora de su zona horaria en Java?
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();
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());