Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[JAVA] GregorianCalendar + TimeZone bug?

Pagina: 1
Acties:
  • 890 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik zit met een vervelend probleem ivm de Java GregorianCalendar klasse.
Wanneer ik de dag/maand/jaar + tijdszone kopiëer naar een tweede Calendar object. Dan is de dag verkeerd. Wanneer ik geen tijdszone meegeef aan het eerste Calendar object, dan is er echter geen enkel probleem. Heeft er iemand een idee wat hier mis gaat?

Heb reeds enkele fora afgezocht zonder duidend antwoord.

Volgende code:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
java.text.SimpleDateFormat dateFormat = new java.text.SimpleDateFormat("dd MM yyyy");
String strDate = "05 08 2007";
java.util.Date date = dateFormat.parse(strDate);

java.util.Calendar calendarA = java.util.Calendar.getInstance(java.util.TimeZone.getTimeZone("Europe/Dublin"));
//java.util.Calendar calendarA = java.util.Calendar.getInstance();
calendarA.setTime(date);

// Create a copy of dd MM yyyy  -> BUG in JAVA ???
java.util.Calendar calendarB = java.util.Calendar.getInstance();
calendarB.setTimeZone(calendarA.getTimeZone());
calendarB.set(calendarA.get(java.util.Calendar.YEAR), calendarA.get(java.util.Calendar.MONTH), calendarA.get(java.util.Calendar.DAY_OF_MONTH));

System.out.println("strDate   : " +strDate);
System.out.println("date      : " +date);
System.out.println("date      : " +dateFormat.format(date));

System.out.println("---\ncalendarA1 : " +calendarA);
System.out.println("calendarA2 : " +calendarA.getTime());
System.out.println("calendarA3 : " +dateFormat.format(calendarA.getTime()) +"  --> CORRECT");
System.out.println("calendarA4 : " +calendarA.get(java.util.Calendar.DAY_OF_MONTH) +"  --> BUG in JAVA??");

System.out.println("---\ncalendarB1 : " +calendarB);
System.out.println("calendarB2 : " +calendarB.getTime());
System.out.println("calendarB3 : " +dateFormat.format(calendarB.getTime()) +"  --> BUG in JAVA when TimeZone is set on calendarA??");
System.out.println("calendarB4 : " +calendarB.get(java.util.Calendar.DAY_OF_MONTH));


Geeft volgende resultaat:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
strDate   : 05 08 2007
date      : Sun Aug 05 00:00:00 CEST 2007
date      : 05 08 2007
---
calendarA1 : java.util.GregorianCalendar[time=1186264800000,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Dublin",offset=0,dstSavings=3600000,useDaylight=true,transitions=228,lastRule=java.util.SimpleTimeZone[id=Europe/Dublin,offset=0,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2007,MONTH=7,WEEK_OF_YEAR=31,WEEK_OF_MONTH=1,DAY_OF_MONTH=4,DAY_OF_YEAR=216,DAY_OF_WEEK=7,DAY_OF_WEEK_IN_MONTH=1,AM_PM=1,HOUR=11,HOUR_OF_DAY=23,MINUTE=0,SECOND=0,MILLISECOND=0,ZONE_OFFSET=0,DST_OFFSET=3600000]
calendarA2 : Sun Aug 05 00:00:00 CEST 2007
calendarA3 : 05 08 2007  --> CORRECT
calendarA4 : 4  --> BUG in JAVA??
---
calendarB1 : java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Dublin",offset=0,dstSavings=3600000,useDaylight=true,transitions=228,lastRule=java.util.SimpleTimeZone[id=Europe/Dublin,offset=0,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2007,MONTH=7,WEEK_OF_YEAR=35,WEEK_OF_MONTH=5,DAY_OF_MONTH=4,DAY_OF_YEAR=240,DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=4,AM_PM=1,HOUR=0,HOUR_OF_DAY=12,MINUTE=12,SECOND=38,MILLISECOND=881,ZONE_OFFSET=3600000,DST_OFFSET=3600000]
calendarB2 : Sat Aug 04 13:12:38 CEST 2007
calendarB3 : 04 08 2007  --> BUG in JAVA when TimeZone is set on calendarA??
calendarB4 : 4

  • Marcj
  • Registratie: November 2000
  • Laatst online: 11:06
De get methode van de Calendar geeft niet de locale 'tijd' terug, maar de UTC tijd. Deze wordt namelijk opgeslagen (kun je ook in je print zien, eigenlijk is calendarA 04-08-2007 om 23:00 uur). Pas bij het printen wordt de echte tijd gegeven. Daarnaast geef je aan calendarB alleen de datum mee (die dus een dag eerder is), maar de tijd niet waardoor deze de tijd van wanneer deze gemaakt is blijft weergeven (12:12:38 +1 uur).

Wat je denk ik het beste kunt doen is de clone functie gebruiken, want deze kopieert wel alles. Of de Calendar niet gebruiken wanneer je niet een tijd wilt opslaan, maar alleen een datum.

Verwijderd

Gebruik bijv calendarB.setTime(calendarA.getTime());

Hierbij wordt het aantal milliseconden dat de datum representeerd in calendarA gekopieerd naar calendarB, in feite dus alle data.

[ Voor 56% gewijzigd door Verwijderd op 28-08-2007 13:06 ]


  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Gebruik bij voorkeur Calendar#clear() vóór de #set() methoden wanneer je met een schone lei wilt beginnen. Voor kopieën moet je inderdaad Calendar#clone() gebruiken.

  • LAN
  • Registratie: Oktober 2000
  • Niet online

LAN

Je probleem zit op een andere plek.
SimpleDateFormat werkt namelijk met de default timezone.

Probeer dit eens (insert tussen regel 1 en 2):
code:
1
dateFormat.setTimeZone(java.util.TimeZone.getTimeZone("Europe/Dublin"));


En run je code daarna nog eens.

[ Voor 17% gewijzigd door LAN op 28-08-2007 16:18 ]


  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

LAN schreef op dinsdag 28 augustus 2007 @ 16:17:
Je probleem zit op een andere plek.
SimpleDateFormat werkt namelijk met de default timezone.

Probeer dit eens (insert tussen regel 1 en 2):
code:
1
dateFormat.setTimeZone(java.util.TimeZone.getTimeZone("Europe/Dublin"));


En run je code daarna nog eens.
Idd, dat was het. Heb vroeger dit probleem gehad met een standaard JSF converter. Die gebruikte ook gewoon een SimpleDateFormat waardoor er bij mij steeds een uur werd afgehaald.

Het gekke was toen alleen dat het bij parse() wel goed ging, maar bij format() niet. (of andersom, tis alweer ff geleden)

Fat Pizza's pizza, they are big and they are cheezy

Pagina: 1