Quand je crée un nouveau Date
objet, elle est initialisée à l'heure actuelle, mais dans le fuseau horaire local. Comment puis-je obtenir la date et l'heure en GMT?
Réponses
Trop de publicités?Comme la réponse correcte par Jon Skeet l'a indiqué, un java.util.Objet Date a pas de temps horaire. Mais son toString
mise en œuvre s'applique à la JVM du fuseau horaire par défaut lors de la génération de la représentation de Chaîne de cette date-valeur du temps. Point de prêter à confusion à la naïveté des programmeur, une Date semble avoir une zone de temps, mais ne le fait pas.
L' java.util.Date
, j.u.Calendar
, et java.text.SimpleDateFormat
classes livré avec Java sont très gênants. Les éviter. Au lieu de cela, utilisez une de ces compétente date de bibliothèques:
- java.temps.* package en Java 8
- Joda-Time
java.temps (Java 8)
Java 8 apporte une excellente nouvelle java.temps.* paquet de supplanter l'ancienne java.util.Date/Calendrier des classes.
Obtenir de l'heure courante au format UTC/GMT est un simple one-liner...
ZonedDateTime now = ZonedDateTime.now( ZoneOffset.UTC );
Vidage de la console...
System.out.println( "now: " + now );
Lors de l'exécuter...
now: 2014-01-21T23:42:03.522Z
La java.temps classes sont définies par la JSR 310. Ils ont été inspirés par Joda-Time mais sont entièrement reconçue.
Joda-Time
À l'aide de la Joda-Time de la 3e partie open-source gratuite de la bibliothèque, vous pouvez obtenir la date actuelle-temps en une seule ligne de code.
Joda-Time a inspiré le nouveau java.temps.* les classes en Java 8, mais a une architecture différente. Vous pouvez utiliser Joda-Time dans les anciennes versions de Java. Joda-Time continue à travailler dans Java 8 et continue d'être activement maintenu (à compter de 2014).
System.out.println( "UTC/GMT date-time in ISO 8601 format: " + new org.joda.time.DateTime( org.joda.time.DateTimeZone.UTC ) );
Plus détaillée un exemple de code (Joda-Time 2.3)...
org.joda.time.DateTime now = new org.joda.time.DateTime(); // Default time zone.
org.joda.time.DateTime zulu = now.toDateTime( org.joda.time.DateTimeZone.UTC );
Vidage de la console...
System.out.println( "Local time in ISO 8601 format: " + now );
System.out.println( "Same moment in UTC (Zulu): " + zulu );
Lors de l'exécuter...
Local time in ISO 8601 format: 2014-01-21T15:34:29.933-08:00
Same moment in UTC (Zulu): 2014-01-21T23:34:29.933Z
Pour plus d'exemple de code en faisant de temps de la zone de travail, voir ma réponse à une question similaire.
ISO 8601
Lisez à propos de la norme ISO 8601 formats. Les deux java.temps et Joda-Time utiliser cette norme est sensé formats par défaut pour à la fois d'analyse et de génération de chaînes.
java.util.Date
a pas de moment précis de la zone, bien que sa valeur est le plus souvent considéré par rapport à UTC. Ce qui vous fait penser que c'est dans l'heure locale?
Pour être plus précis: la valeur à l'intérieur d'un java.util.Date
est le nombre de millisecondes écoulées depuis l'époque Unix, qui a eu lieu à minuit le 1er janvier 1970 UTC. À la même époque, peut aussi être décrit dans d'autres fuseaux horaires, mais la traditionnelle description en termes de UTC. Comme c'est un nombre de millisecondes depuis un fixe époque, la valeur au sein d' java.util.Date
est le même partout dans le monde, à tout instant, quel que soit le fuseau horaire local.
Je soupçonne que le problème, c'est que vous êtes à l'affichage par l'intermédiaire d'une instance de Calendrier qui utilise le fuseau horaire local, ou éventuellement à l'aide de Date.toString()
qui utilise également le fuseau horaire local, ou un SimpleDateFormat
de l'instance, qui, par défaut, utilise également le fuseau horaire local.
Si ce n'est pas le problème, s'il vous plaît poster un exemple de code.
Je voudrais, cependant, vous recommandons d'utiliser Joda-Time de toute façon, ce qui donne une image beaucoup plus claire de l'API.
SimpleDateFormat dateFormatGmt = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss");
dateFormatGmt.setTimeZone(TimeZone.getTimeZone("GMT"));
//Local time zone
SimpleDateFormat dateFormatLocal = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss");
//Time in GMT
return dateFormatLocal.parse( dateFormatGmt.format(new Date()) );
Absolument, cela renvoie l'heure UTC: une Chaîne de Date et d'objets !
static final String DATEFORMAT = "yyyy-MM-dd HH:mm:ss"
public static Date GetUTCdatetimeAsDate()
{
//note: doesn't check for null
return StringDateToDate(GetUTCdatetimeAsString());
}
public static String GetUTCdatetimeAsString()
{
final SimpleDateFormat sdf = new SimpleDateFormat(DATEFORMAT);
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
final String utcTime = sdf.format(new Date());
return utcTime;
}
public static Date StringDateToDate(String StrDate)
{
Date dateToReturn = null;
SimpleDateFormat dateFormat = new SimpleDateFormat(DATEFORMAT);
try
{
dateToReturn = (Date)dateFormat.parse(StrDate);
}
catch (ParseException e)
{
e.printStackTrace();
}
return dateToReturn;
}
Calendar c = Calendar.getInstance();
System.out.println("current: "+c.getTime());
TimeZone z = c.getTimeZone();
int offset = z.getRawOffset();
if(z.inDaylightTime(new Date())){
offset = offset + z.getDSTSavings();
}
int offsetHrs = offset / 1000 / 60 / 60;
int offsetMins = offset / 1000 / 60 % 60;
System.out.println("offset: " + offsetHrs);
System.out.println("offset: " + offsetMins);
c.add(Calendar.HOUR_OF_DAY, (-offsetHrs));
c.add(Calendar.MINUTE, (-offsetMins));
System.out.println("GMT Time: "+c.getTime());