1 Reply Latest reply: May 2, 2014 7:56 PM by rp0428 RSS

    Timezone conversion.

    p4predator

      Hi Folks.

      I would like to know how to convert a time from one specific timezone to another specific timezone.

      The code does not convert the time correctly. But if I replace Date date = sdfAlien.parse("16:00:00"); to Date date = new Date(); then conversion works but that's not what I want as my input will be supplied by users with time in HH:MM:SS and Java supported timezone.

      In below case, we can say "16:00:00" and "Asia/Singapore" will be supplied by the user and I need to convert it to America/New_York time.

       

      SimpleDateFormat sdfAlien = new SimpleDateFormat("HH:mm:ss");
      SimpleDateFormat sdfLocal = new SimpleDateFormat("HH:mm:ss");
      sdfAlien.setTimeZone(TimeZone.getTimeZone("Asia/Singapore"));
      sdfLocal.setTimeZone(TimeZone.getTimeZone("America/New_York"));
      try {
      Date date = sdfAlien.parse("16:00:00");
      String alienTime = sdfAlien.format(date);
      String localTime = sdfLocal.format(date);
      System.out.println("Local Time:" + localTime + ", Alien Time:" + alienTime);
      } catch (ParseException e) {
      e.printStackTrace();
      }

       

      Thanks.

        • 1. Re: Timezone conversion.
          rp0428
          I would like to know how to convert a time from one specific timezone to another specific timezone.

          Sorry - that is NOT possible. You cannot convert 'time'; you must convert 'dates' that include a time and, optionally, a

           

          timezone.

          The code does not convert the time correctly.

          Not surprising - given what I explained above.

          Date date = sdfAlien.parse("16:00:00");

          Ok - care to guess at what year, month and day that Date that will create?

           

          Print out the value on the console if you want.

           

          Then when you are ready read the API for the SimpleDateFormat itself. See the 'parse' method description if you need to

          http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

          Year: If the formatter's Calendar is the Gregorian calendar, the following rules are applied.

           

          • For formatting, if the number of pattern letters is 2, the year is truncated to 2 digits; otherwise it is interpreted as a number
          • For parsing, if the number of pattern letters is more than 2, the year is interpreted literally, regardless of the number of digits. So using the pattern "MM/dd/yyyy", "01/11/12" parses to Jan 11, 12 A.D. 
          • For parsing with the abbreviated year pattern ("y" or "yy"), SimpleDateFormat must interpret the abbreviated year relative to some century. It does this by adjusting dates to be within 80 years before and 20 years after the time the SimpleDateFormat instance is created. For example, using a pattern of "MM/dd/yy" and a SimpleDateFormat instance created on Jan 1, 1997, the string "01/11/12" would be interpreted as Jan 11, 2012 while the string "05/04/64" would be interpreted as May 4, 1964. During parsing, only strings consisting of exactly two digits, as defined by Character.isDigit(char), will be parsed into the default century. Any other numeric string, such as a one digit string, a three or more digit string, or a two digit string that isn't all digits (for example, "-1"), is interpreted literally. So "01/02/3" or "01/02/003" are parsed, using the same pattern, as Jan 2, 3 AD. Likewise, "01/02/-3" is parsed as Jan 2, 4 BC.

          Do you see why you got the result you got yet?

          But if I replace Date date = sdfAlien.parse("16:00:00"); to Date date = new Date(); then conversion works

          Ok - so now what year, month and day do you think THAT statement will create?

           

          Print it out on the console and see.

           

          Hint: Daylight Savings Time did NOT exist centuries ago. You need to provide a date value (year, month, day) appropriate for your use case.