Java, zelfde locale geeft verschillende weeknummers op PCs

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • steveman
  • Registratie: Mei 2001
  • Laatst online: 12:37

steveman

Comfortabel ten onder

Topicstarter
Weet iemand wat voor systeeminstelling invloed heeft op de Java Calendar onder windows? Ik zie namelijk een vooralsnog onverklaard verschil tussen mijn computer en die van een collega.

Bij het opvragen van het weeknummer van de huidige datum (24-8-2016) krijg ik op mijn machine keurig weeknummer 34 terug in de nl_NL locale. (35 als ik US opgeef, en 34 met DE).

Maar bij een collega (en alleen die collega) die daadwerkelijk met de software werkt komt er steevast weeknummer 35 uit, en de reden snap ik niet. In Outlook kloppen de weeknummers op beide machines wel gewoon, wat het probleem naar Java lijkt te isoleren.

We draaien allebei windows 10, en ik heb dezelfde JRE, jre1.8.0_101 (javaw.exe versie 8.0.1010.13) erbij gepakt.

Als test heb ik een klein progje gemaakt wat het verschil netjes aangeeft:

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
27
28
29
30
31
32
33
34
35
package com.wtf.calendar;

import java.text.ParseException;
import java.util.Calendar;
import java.util.Locale;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.WindowConstants;

public class CalendarCheck {
    public static void main(String[] args) throws ParseException {
        Calendar calUs = Calendar.getInstance(Locale.US);
        String usToday = "deze week US: \t\t" + calUs.get(Calendar.WEEK_OF_YEAR) + " (zou 35 moeten zijn op 24-8-2016)";

        Calendar calDe = Calendar.getInstance(Locale.GERMAN);
        String deToday = "deze week DE: \t\t" + calDe.get(Calendar.WEEK_OF_YEAR) + " (zou 34 moeten zijn op 24-8-2016)";
        
        Calendar calDef = Calendar.getInstance();
        String defToday = "deze week default: \t" + calDef.get(Calendar.WEEK_OF_YEAR) + " (zou 34 moeten zijn op 24-8-2016)";

        JFrame frame = new JFrame("Gedonder met kalender");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        JTextArea textArea = new JTextArea(20, 2);
        String defaultLocale = "Default locale: " + Locale.getDefault() + "\t(zou nl_NL moeten zijn)";
        textArea.setText("vandaag:\n" + usToday + "\n" + deToday + "\n" + defToday+"\n"+defaultLocale); 
        
        JScrollPane scrollPane = new JScrollPane(textArea);
        
        frame.add(scrollPane);
        frame.setSize(600, 400);
        frame.setVisible(true);
    }
}


Op de computer van mijn collega komt er bij de weeknummers doodleuk steeds 35 uit, ook waar 34 wordt verwacht. Bij mij klopt het wel allemaal.

Bij het zoeken naar dit probleem komt ik alleen maar het euvel tegen dat mensen zich niet bewust waren van het verschil in weeknotaties tussen verschillende locales (US definieert de eerste week van het jaar anders dan dat wij en DE dat doen).

Door de region aan te passen op mijn pc kan ik het probleem niet reproduceren in ieder geval, en eigenlijk had ik verwacht dat de default locale het probleem zou zijn, maar dat is het ook niet.

Iemand een idee wat het probleem kan zijn?

"Take the risk of thinking for yourself. Much more happiness, truth, beauty, and wisdom will come to you that way." -Christopher Hitchens | In memoriam? 🏁 ipv kruis!

Beste antwoord (via steveman op 29-08-2016 15:05)


  • DaCoTa
  • Registratie: April 2002
  • Laatst online: 10-10 12:42
Als migratie naar Java 8 op de horizon ligt, kun je overwegen om Joda over te slaan en http://www.threeten.org/threetenbp/ te gebruiken, de backport van JSR-310 (java.time) voor Java 7.

Alle reacties


Acties:
  • 0 Henk 'm!

  • Feanathiel
  • Registratie: Juni 2007
  • Niet online

Feanathiel

Cup<Coffee>

Hoe staat zijn 'eerste dag van de week' ingesteld (zondag/maandag)?

Misschien niet heel relevant, maar ben dit issue ook wel eens tegen gekomen in .NET. Wanneer je kiest voor een specifieke locale, dan kies je voor de instellingen van de gebruiker die zijn ingesteld voor die specifieke locale. Maw: NL_nl geselecteerd, met een datumnotatie van yyyy-mm-dd zorgt er ook voor dat het framework het op die manier gaat parsen. Vandaar mijn referentie naar 'eerste dag van de week'.

Acties:
  • 0 Henk 'm!

  • steveman
  • Registratie: Mei 2001
  • Laatst online: 12:37

steveman

Comfortabel ten onder

Topicstarter
Feanathiel schreef op woensdag 24 augustus 2016 @ 12:18:
Hoe staat zijn 'eerste dag van de week' ingesteld (zondag/maandag)?

Misschien niet heel relevant, maar ben dit issue ook wel eens tegen gekomen in .NET. Wanneer je kiest voor een specifieke locale, dan kies je voor de instellingen van de gebruiker die zijn ingesteld voor die specifieke locale. Maw: NL_nl geselecteerd, met een datumnotatie van yyyy-mm-dd zorgt er ook voor dat het framework het op die manier gaat parsen. Vandaar mijn referentie naar 'eerste dag van de week'.
Jammer, het was zo'n mooie insteek, maar dat is het niet. Op mijn pc geprobeerd om via de klok instellingen de eerste dag van de week aan te passen en daarna nog de registry entries voor iFirstDayOfWeek en IFirstWeekOfYear aangepast en een reboot gedaan, maar de uitkomst in Java werd er niet anders van :(

"Take the risk of thinking for yourself. Much more happiness, truth, beauty, and wisdom will come to you that way." -Christopher Hitchens | In memoriam? 🏁 ipv kruis!


Acties:
  • 0 Henk 'm!

  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 09-10 22:10
Geef naast de Locale ook eens een correcte TimeZone behorend bij die Locale mee aan Calendar.getInstance() en kijk of je het verschil dan nog ziet. Het weeknummer hangt namelijk af van de eerste week bepaling en daarop kan de TimeZone zomaar invloed hebben.

Acties:
  • 0 Henk 'm!

  • steffex
  • Registratie: Augustus 2003
  • Laatst online: 12-08 00:24
Als je in de command prompt de huidige tijd opvraagt bij beide systemen, krijg je dan ook identieke datum/tijd eruit?

Acties:
  • 0 Henk 'm!

  • steveman
  • Registratie: Mei 2001
  • Laatst online: 12:37

steveman

Comfortabel ten onder

Topicstarter
Kwistnix schreef op woensdag 24 augustus 2016 @ 13:06:
Geef naast de Locale ook eens een correcte TimeZone behorend bij die Locale mee aan Calendar.getInstance() en kijk of je het verschil dan nog ziet. Het weeknummer hangt namelijk af van de eerste week bepaling en daarop kan de TimeZone zomaar invloed hebben.
Zojuist geprobeerd met time zones "CET" en "PST" te proberen voor de DE en US tijd (beide combinaties), maar geen resultaat. Bij het uitprinten van de timezone van de calendars zie ik wel dat de waarden voor startDay verschillen, maar bij de uitkomst maakt dit dus geen verschil meer.
steffex schreef op woensdag 24 augustus 2016 @ 13:13:
Als je in de command prompt de huidige tijd opvraagt bij beide systemen, krijg je dan ook identieke datum/tijd eruit?
middels date & time krijg ik dezelfde output.

[ Voor 17% gewijzigd door steveman op 24-08-2016 13:47 ]

"Take the risk of thinking for yourself. Much more happiness, truth, beauty, and wisdom will come to you that way." -Christopher Hitchens | In memoriam? 🏁 ipv kruis!


Acties:
  • 0 Henk 'm!

  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
Wellicht dit even naar de console schrijven: getFirstDayOfWeek()

Acties:
  • 0 Henk 'm!

  • steveman
  • Registratie: Mei 2001
  • Laatst online: 12:37

steveman

Comfortabel ten onder

Topicstarter
raptorix schreef op woensdag 24 augustus 2016 @ 14:30:
Wellicht dit even naar de console schrijven: getFirstDayOfWeek()
Ondertussen is mijn onlangs ontvreemde werklaptop vervangen voor een nieuwe, en heb ik windows in het Engels geinstalleerd, zodoende is mijn default locale veranderd in java, maar voor m'n collega is er niets veranderd, en ook het probleem is hetzelfde gebleven.

Mijn output:
Default locale: en_GB
eerste dag van de week DE : 2
eerste dag van de week US : 1
eerste dag van de week default : 2
Collega's output:
Default locale: nl_NL
eerste dag van de week DE : 1
eerste dag van de week US : 1
eerste dag van de week default : 1
Waarbij de DE calendar timezone CET heeft, en US PST, en default Europe/Berlin. Dus hoe is de DE locale nou zo in de soep gelopen?

Bij het uitprinten van de TimeZone, zijn er geen verschillen tussen de situatie bij mij en die van m'n collega, dus twee keer per timezone:

id="Europe/Berlin",
offset=3600000,
dstSavings=3600000,
useDaylight=true,
transitions=143,
lastRule=java.util.SimpleTimeZone[id=Europe/Berlin,
offset=3600000,
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]]

"Take the risk of thinking for yourself. Much more happiness, truth, beauty, and wisdom will come to you that way." -Christopher Hitchens | In memoriam? 🏁 ipv kruis!


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 14:49
Ik zou je graag deze willen toewerpen: http://stackoverflow.com/...-of-year-for-given-a-date en dan met name de onderste post.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • steveman
  • Registratie: Mei 2001
  • Laatst online: 12:37

steveman

Comfortabel ten onder

Topicstarter
farlane schreef op woensdag 24 augustus 2016 @ 16:17:
Ik zou je graag deze willen toewerpen: http://stackoverflow.com/...-of-year-for-given-a-date en dan met name de onderste post.
Oef, dat wordt gelijk een flinke verbouwing!

http://stackoverflow.com/...ent-on-different-machines

Dit kon ook wel eens een kanshebber zijn, helaes is de probleemlaptop nu mee naar huis met de collega in kwestie :+

[ Voor 43% gewijzigd door steveman op 24-08-2016 16:37 ]

"Take the risk of thinking for yourself. Much more happiness, truth, beauty, and wisdom will come to you that way." -Christopher Hitchens | In memoriam? 🏁 ipv kruis!


Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
Is er een reden dat je geen JodaTime of the nieuwe Java 8 time API gebruikt?

https://niels.nu


  • steveman
  • Registratie: Mei 2001
  • Laatst online: 12:37

steveman

Comfortabel ten onder

Topicstarter
Hydra schreef op woensdag 24 augustus 2016 @ 20:23:
Is er een reden dat je geen JodaTime of the nieuwe Java 8 time API gebruikt?
Dat betekent een nogal flinke verbouwing van een bestaand product, dus het liefst voorkomen we dat.

"Take the risk of thinking for yourself. Much more happiness, truth, beauty, and wisdom will come to you that way." -Christopher Hitchens | In memoriam? 🏁 ipv kruis!


Acties:
  • 0 Henk 'm!

  • JBrennan
  • Registratie: Maart 2009
  • Laatst online: 07-01 16:39
steveman schreef op donderdag 25 augustus 2016 @ 09:56:
[...]


Dat betekent een nogal flinke verbouwing van een bestaand product, dus het liefst voorkomen we dat.
Waarom geen utility class die wel met een LocalDate/Time werkt. Kan je in je bestaande code een Date/Calendar gebruiken, maar voor je weeknummers roep je die utility class aan. Ja, moet je nog steeds eea aanpassen, maar wel minder dan alle Date/Calendar objecten er uit schrijven.

Acties:
  • 0 Henk 'm!

  • steveman
  • Registratie: Mei 2001
  • Laatst online: 12:37

steveman

Comfortabel ten onder

Topicstarter
Okay, verwarrende ontwikkeling, zojuist even een testje gedraaid met joda time (we zitten voorlopig nog op Java 7, dus de J8 Time gebruiken gaat nog even niet) en daarbij zie ik op mijn computer dat het in de US timezone week 34 is... Dus ik dat checken op wolfram:

Afbeeldingslocatie: https://i.imgur.com/rd8F0yY.png

Week 34 klopt dus gewoon, maar java zegt doodleuk 35.

Joda time geeft keurig 34 aan, ik zal m'n testprogrammaatje eens draaien bij m'n collega, als joda het daar ook goed doet moeten we denk ik de aanpassing in het hele programmma maar door gaan voeren.

heel raar dit echt is

Maandag is de collega met de probleemlaptop weer terug, dan joda daar eens testen.

[ Voor 6% gewijzigd door steveman op 26-08-2016 10:51 ]

"Take the risk of thinking for yourself. Much more happiness, truth, beauty, and wisdom will come to you that way." -Christopher Hitchens | In memoriam? 🏁 ipv kruis!


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 14:49
Ook .NET doet weeknummers niet correct volgens ISO8601, dus Java is niet alleen. :P

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • DaCoTa
  • Registratie: April 2002
  • Laatst online: 10-10 12:42
Als migratie naar Java 8 op de horizon ligt, kun je overwegen om Joda over te slaan en http://www.threeten.org/threetenbp/ te gebruiken, de backport van JSR-310 (java.time) voor Java 7.

Acties:
  • 0 Henk 'm!

  • steveman
  • Registratie: Mei 2001
  • Laatst online: 12:37

steveman

Comfortabel ten onder

Topicstarter
Hydra schreef op woensdag 24 augustus 2016 @ 20:23:
Is er een reden dat je geen JodaTime of the nieuwe Java 8 time API gebruikt?
Zojuist een testje gedraaid met JodaTime, dit geeft het gewenste resultaat, helaes betekent dat dus even een verbouwing... Maar het zij zo.

"Take the risk of thinking for yourself. Much more happiness, truth, beauty, and wisdom will come to you that way." -Christopher Hitchens | In memoriam? 🏁 ipv kruis!


Acties:
  • +1 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 17:53

Janoz

Moderator Devschuur®

!litemod

Ikzelf zou sterk aanraden om DaCoTa's tip op te volgen, tenzij je nog op java 6 zit. JodaTime was een vervanging voor de brakke implementatie in Java zelf, maar met de nieuwe time api is Joda een beetje obsolete geworden.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • +1 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
Janoz schreef op maandag 29 augustus 2016 @ 14:51:
Ikzelf zou sterk aanraden om DaCoTa's tip op te volgen, tenzij je nog op java 6 zit. JodaTime was een vervanging voor de brakke implementatie in Java zelf, maar met de nieuwe time api is Joda een beetje obsolete geworden.
FYI: Nieuwe time API is Java 8, niet Java 7.

Streams + Lambda's + Time API is voor mij eigenlijk de reden dat ik geen pre-8 projecten meer wil doen.

[ Voor 0% gewijzigd door Hydra op 29-08-2016 15:51 . Reden: Ik moet leren lezen ]

https://niels.nu

Pagina: 1