How to make Date locale-independent?

后端 未结 5 1861
我在风中等你
我在风中等你 2021-01-06 10:13

I have a db, that stores dates in OleDateTime format, in GMT timezone. I\'ve implemented a class, extending Date in java to represent that in class

相关标签:
5条回答
  • 2021-01-06 10:27

    Here's a snippet I used to calculate the GMT offset from the Calendar instance and format it. I appreciate all the help I've gotten from this site, its nice to contribute. I hope this helps someone somewhere. Enjoy.

    Calendar calInst = Calendar.getInstance();
    
    //calculate the offset to keep calendar instance GMT
    int gmtOffsetMilli = calInst.get(Calendar.ZONE_OFFSET);
    long gmtOffsetHr = TimeUnit.HOURS.convert(gmtOffsetMilli, TimeUnit.MILLISECONDS);
    
    calInst = Calendar.getInstance(TimeZone.getTimeZone("GMT " + gmtOffsetHr));
    
    0 讨论(0)
  • 2021-01-06 10:28

    A Date is locale-independent, always using GMT timezone. It's just a wrapper around a millisecond timestamp in GMT (more correctly: UTC).

    The only things in Date that are timezone dependant are the deprecated methods like getDay() - that's why they're deprecated. Those use the default time zone. The correct thing to do is to avoid using those deprecated methods - not to set the default timezone to UTC! That could cause problems elsewhere, and you can't prevent other parts of the code from setting the default timezone to something else.

    0 讨论(0)
  • 2021-01-06 10:37

    Use a Calendar object:

    Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"),
                                        locale);
    
    0 讨论(0)
  • 2021-01-06 10:43

    Well, it's better to use the Calendar object like suggested in other answers. However, if you really want to set global timezone, you can use TimeZone.setDefault(TimeZone.getTimeZone("UTC")); early in your application code. There is also user.timezone Java system property.

    Also (just fun to know), it appears that the only country actually living by GMT/UTC time (without daylight saving changes) is Liberia.

    In fact, Date objects per se are always locale- and timezone-independent. Its getTime() method will always return the number of milliseconds passed since January 1, 1970 00:00:00 (not counting leap seconds) in UTC. But if you want to get something else than milliseconds, you have to use Calendar, which is timezone-dependent. But it is the right way to go. You don't use that deprecated methods in Date class, do you?

    0 讨论(0)
  • 2021-01-06 10:50

    As Michael Borgwardt has already said, the Java Date object does not know anything about timezones. It's just a wrapper for a number of milliseconds since 01-01-1970 00:00:00 UTC.

    You start dealing with timezones only when you for example convert the Date object to a String using a DateFormat. You set the timezone on the DateFormat to specify in which timezone you want to see the Date.

    DateFormat df = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss Z");
    df.setTimeZone(TimeZone.getTimeZone("UTC"));
    
    String text = df.format(date);  // text will contain date represented in UTC
    
    0 讨论(0)
提交回复
热议问题