日期和时间转换为java中的其他时区

时间:2012-02-24 10:42:46

标签: java date timezone date-conversion

我已编写此代码以将当前系统日期和时间转换为其他时区。我没有收到任何错误,但我没有按预期得到我的输出。就像我在特定时间执行我的程序一样..我的输出是::

印度目前的时间是:: Fri Feb 24 16:09:23 IST 2012

:: 中央标准时间中的日期和时间为:: Sat Feb 25 03:39:23 IST 2012

根据 CST时区的实际时间是::

Friday, 24 February 4:39:16 a.m(GMT - 6:00)

所以有一些时间差。我不知道为什么会这样。任何帮助将不胜感激..代码是::

package MyPackage;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;

import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class Temp2 {


    public static void main(String[] args) {

        try {
            Calendar currentdate = Calendar.getInstance();
            String strdate = null;
            DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
            strdate = formatter.format(currentdate.getTime());
            TimeZone obj = TimeZone.getTimeZone("CST");

            formatter.setTimeZone(obj);
            //System.out.println(strdate);
            //System.out.println(formatter.parse(strdate));
            Date theResult = formatter.parse(strdate);

            System.out.println("The current time in India is  :: " +currentdate.getTime());

            System.out.println("The date and time in :: "+ obj.getDisplayName() + "is ::" + theResult);
        } catch (ParseException e) {
           e.printStackTrace();
        }
    }
}

8 个答案:

答案 0 :(得分:19)

它在网上。可以用Google搜索。无论如何,这里有一个版本(从here无耻地挑选和修改):

Calendar calendar = Calendar.getInstance();
TimeZone fromTimeZone = calendar.getTimeZone();
TimeZone toTimeZone = TimeZone.getTimeZone("CST");

calendar.setTimeZone(fromTimeZone);
calendar.add(Calendar.MILLISECOND, fromTimeZone.getRawOffset() * -1);
if (fromTimeZone.inDaylightTime(calendar.getTime())) {
    calendar.add(Calendar.MILLISECOND, calendar.getTimeZone().getDSTSavings() * -1);
}

calendar.add(Calendar.MILLISECOND, toTimeZone.getRawOffset());
if (toTimeZone.inDaylightTime(calendar.getTime())) {
    calendar.add(Calendar.MILLISECOND, toTimeZone.getDSTSavings());
}

System.out.println(calendar.getTime());

答案 1 :(得分:8)

您的错误是拨打parse而不是format

您调用parse来解析字符串中的日期,但在您的情况下,您有一个日期,需要使用正确的时区对其进行格式化。

替换您的代码
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())

我希望你能得到你期望的输出。

答案 2 :(得分:4)

在我的日常工作中使用Java处理日期是一项非常重要的任务。我建议您使用Joda-Time来简化编码日,而不必“重新发明轮子”。

答案 3 :(得分:1)

问题是当您打印日期obj时调用toString方法,它将在您的计算机默认时区中打印。试试这个代码,看看差异。

Calendar currentdate = Calendar.getInstance();
String strdate = null;
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ssz");
strdate = formatter.format(currentdate.getTime());
System.out.println("strdate=>" + strdate);
TimeZone obj = TimeZone.getTimeZone("CST");

formatter.setTimeZone(obj);
strdate = formatter.format(currentdate.getTime());
Date theResult = formatter.parse(strdate);

System.out.println("The current time in India is  :: " +currentdate.getTime());

System.out.println("The date and time in :: " + obj.getDisplayName() + "is ::" + theResult);
System.out.println("The date and time in :: " + obj.getDisplayName() + "is ::" + strdate);

答案 4 :(得分:1)

您可以使用" CST6CDT" 因为在一些国家,他们在夏天跟随CDT,在冬天跟随CST

 public static String getDateInCST() {
             Calendar calendar = Calendar.getInstance();
             DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
             formatter.setTimeZone(TimeZone.getTimeZone( "CST6CDT"));
             String strdate = formatter.format(calendar.getTime());
             TimeZone.getAvailableIDs();
             return strdate;
     }

答案 5 :(得分:0)

第一条消息,请不要在代码中将日期和时间当作字符串来处理。就像您不将数字和布尔值当作字符串一样处理(我希望如此)。使用正确的日期时间对象。

java.time

有时我们将日期和时间作为字符串输入。例如,它可以来自文本文件,来自用户或与另一系统的数据交换。在这些情况下,首先要解析为适当的日期时间对象。第二条消息,使用现代Java日期和时间API java.time进行日期和时间工作。

    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);

此代码段的输出为:

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

要转换为格林尼治标准时间:

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

如果需要输出字符串,请使用日期时间格式化程序进行格式化。这是一个针对美国观众的格式示例:

    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

您另外询问:

在以下两个结果之间,您应该选择哪个?

我理解您问的是因为这两个都是有效答案。 2015年11月1日,夏令时(DST)在凌晨2点结束。也就是说,在01:59:59之后第二次到达01:00:00。因此,当我们以2015-11-01 01:00:00作为输入时,它是模棱两可的。该时间可能是格林尼治标准时间05:00(美国东部标准时间),也可能是一小时后的东部标准时间,因此等于格林尼治标准时间06:00。我无法告诉您哪种情况对您来说是正确的。您可以使用withEarlierOffsetAtOverlap()withLaterOffsetAtOverlap()控制获得的结果。上面我们得到了DST的解释。因此,要获得标准的时间解释:

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

纽约的其他时间:2015-11-01T01:00-05:00 [美国/纽约]

我们注意到,一天中的小时仍为01:00,但偏移量现在为-05:00,而不是-04:00。这也为我们提供了不同的GMT时间:

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

避免使用SimpleDateFormat和朋友

尽管其他答案通常是正确的,但那里使用的类DateFormatSimpleDateFormatDateCalendar设计得很差,而且已经过时了。前两个特别麻烦。我建议您避免所有这些。坦白地说,我觉得现代API更好用。

链接

Oracle tutorial: Date Time解释了如何使用java.time。

答案 6 :(得分:0)

2020在这里回答

如果您想要新的java.time.*功能,但仍想与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());
    }

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());
    }

答案 7 :(得分:0)

对于谷歌日历 API

private String getFormatedDate(Date date)
    {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss+05:30");
        df.setTimeZone(TimeZone.getTimeZone("GMT+05:30"));
        return df.format(date);
    }