Date and time conversion to some other Timezone in java

后端 未结 10 470
失恋的感觉
失恋的感觉 2020-12-11 21:13

i have written this code to convert the current system date and time to some other timezone. I am not getting any error but i am not getting my output as expected. Like if i

相关标签:
10条回答
  • 2020-12-11 21:56

    First message, don’t handle your date and time as strings in your code. Just as you don’t handle numbers and Boolean values as strings (I hope). Use proper date-time objects.

    java.time

    Sometimes we get date and time as string input. It may be from a text file, from the user or from data exchange with another system, for example. In those cases parse into a proper date-time object first thing. Second message, use java.time, the modern Java date and time API, for your date and time work.

        DateTimeFormatter formatter
                = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
    
        String input = "2015-11-01 01:00:00";
    
        ZonedDateTime nyTime = LocalDateTime.parse(input, formatter)
                .atZone(ZoneId.of("America/New_York"));
        System.out.println("Time in New York: " + nyTime);
    

    Output from this snippet is:

    Time in New York: 2015-11-01T01:00-04:00[America/New_York]
    

    To convert to GMT:

        OffsetDateTime gmtTime = nyTime.toOffsetDateTime()
                .withOffsetSameInstant(ZoneOffset.UTC);
        System.out.println("GMT Time: " + gmtTime);
    
    GMT Time: 2015-11-01T05:00Z
    

    If you need to give string output, format using a date-time formatter. Here’s an example of formatting for an American audience:

        DateTimeFormatter userFormatter
                = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM)
                        .withLocale(Locale.US);
        String formattedDateTime = gmtTime.format(userFormatter);
        System.out.println("GMT Time formatted for user: " + formattedDateTime);
    
    GMT Time formatted for user: Nov 1, 2015, 5:00:00 AM
    

    You additionally asked:

    Between the two results below, which one should you take?

    I understand that you ask because both are valid answers. On November 1, 2015 summer time (DST) ended at 2 AM. That is, after 01:59:59 came 01:00:00 a second time. So when we have got 2015-11-01 01:00:00 as input, it is ambiguous. It could be in Eastern Daylight Time, equal to 05:00 GMT, or it could be in Eastern Standard Time, one hour later, hence equal to 06:00 GMT. There is no way that I can tell you which of them is correct in your case. You may control which result you get using withEarlierOffsetAtOverlap() or withLaterOffsetAtOverlap(). Above we got the DST interpretation. So to get the standard time interpretation:

        nyTime = nyTime.withLaterOffsetAtOverlap();
        System.out.println("Alternate time in New York: " + nyTime);
    

    Alternate time in New York: 2015-11-01T01:00-05:00[America/New_York]

    We notice that the hour of day is still 01:00, but the offset is now -05:00 instead of -04:00. This also gives us a different GMT time:

    GMT Time: 2015-11-01T06:00Z
    GMT Time formatted for user: Nov 1, 2015, 6:00:00 AM
    

    Avoid SimpleDateFormat and friends

    While the other answers are generally correct, the classes DateFormat, SimpleDateFormat, Date and Calendar used there are poorly designed and long outdated. The first two are particularly troublesome. I recommend you avoid all of them. I frankly find the modern API so much nicer to work with.

    Link

    Oracle tutorial: Date Time explaining how to use java.time.

    0 讨论(0)
  • 2020-12-11 22:07

    Your mistake is to call parse instead of format.

    You call parse to parse a Date from a String, but in your case you've got a Date and need to format it using the correct Timezone.

    Replace your code with

    Calendar currentdate = Calendar.getInstance();
    DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
    TimeZone obj = TimeZone.getTimeZone("CST");
    formatter.setTimeZone(obj);
    System.out.println("Local:: " +currentdate.getTime());
    System.out.println("CST:: "+ formatter.format(currentdate.getTime()));
    

    and I hope you'll get the output you are expecting.

    0 讨论(0)
  • 2020-12-11 22:07

    2020 Answer Here

    If you want the new java.time.* feature but still want to mess with java.util.Date:

     public static Date convertBetweenTwoTimeZone(Date date, String fromTimeZone, String toTimeZone) {
            ZoneId fromTimeZoneId = ZoneId.of(fromTimeZone);
            ZoneId toTimeZoneId = ZoneId.of(toTimeZone);
    
            ZonedDateTime fromZonedDateTime =
                    ZonedDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()).withZoneSameLocal(fromTimeZoneId);
    
            ZonedDateTime toZonedDateTime = fromZonedDateTime
                    .withZoneSameInstant(toTimeZoneId)
                    .withZoneSameLocal(ZoneId.systemDefault())
                    ;
    
            return Date.from(toZonedDateTime.toInstant());
        }
    

    for java.sql.Timestamp

        public static Timestamp convertBetweenTwoTimeZone(Timestamp timestamp, String fromTimeZone, String toTimeZone) {
    
            ZoneId fromTimeZoneId = ZoneId.of(fromTimeZone);
            ZoneId toTimeZoneId = ZoneId.of(toTimeZone);
    
            LocalDateTime localDateTimeBeforeDST = timestamp.toLocalDateTime();
    
            ZonedDateTime fromZonedDateTime = ZonedDateTime.of(localDateTimeBeforeDST, fromTimeZoneId);
    
            ZonedDateTime toZonedDateTime = fromZonedDateTime.withZoneSameInstant(toTimeZoneId);
    
            return Timestamp.valueOf(toZonedDateTime.toLocalDateTime());
        }
    
    0 讨论(0)
  • 2020-12-11 22:10

    Please refer to below mentioned code.

         DateFormat utcConverter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         utcConverter.setTimeZone(TimeZone.getTimeZone("GMT"));
         String sampleDateTime = "2015-11-01 01:00:00";
         DateFormat nyConverter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         nyConverter.setTimeZone(TimeZone.getTimeZone("EST"));
         Calendar nyCal = Calendar.getInstance();
    
         nyCal.setTime(nyConverter.parse(sampleDateTime));
    
         System.out.println("NY TIME :" +nyConverter.format(nyCal.getTime()));
    
        System.out.println("GMT TIME  :" +utcConverter.format(nyCal.getTime()));
    
    0 讨论(0)
提交回复
热议问题