如何将日期和时间转换为用户时区

时间:2011-12-30 05:07:03

标签: java calendar timezone simpledateformat

Calendar cal = Calendar.getInstance();
cal.setTimeZone(TimeZone.getTimeZone("PST"));
cal.setTime(new Date());

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a");

Date resultdate = new Date(cal.getTimeInMillis());
sdf.setTimeZone(TimeZone.getTimeZone("PST"));

System.out.println("String date:"+sdf.format(resultdate));
System.out.println("Date:"+sdf.parse(sdf.format(resultdate)));

输出:

String date:2011-12-29 09:01:58 PM                                               
Date:Fri Dec 30 10:31:58 IST 2011

问题:

  1. sdf.format(resultdate)按时区返回正确的日期和时间。但是,
  2. sdf.parse(sdf.format(resultdate))没有按时区返回正确的日期和时间,如何解决此问题?

5 个答案:

答案 0 :(得分:2)

Date类只是围绕“epoch”(1970年1月1日,格林威治标准时间00:00:00)之后的毫秒数的薄包装。它不存储任何时区信息。在上次调用中,您要向String添加一个日期实例,该实例隐式调用toString()方法。 toString()方法将使用默认时区来创建表示实例的String(因为它不存储任何时区信息)。尝试修改最后一行以避免使用toString()方法。

System.out.println("Date:" + sdf.format(sdf.parse(sdf.format(resultdate))));

答案 1 :(得分:1)

为方便起见,请尝试使用joda-Time api。示例是here

答案 2 :(得分:0)

Unfortunatley Java日期仅返回GMT时间。如果您希望在前端或某些位置显示,则需要使用step1中生成的格式化String。

答案 3 :(得分:0)

尝试下面的代码,它会起作用。

Calendar cal = Calendar.getInstance();
cal.setTimeZone(TimeZone.getTimeZone("PST"));
cal.setTime(new Date());

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a");
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a");

Date resultdate = new Date(cal.getTimeInMillis());
sdf.setTimeZone(TimeZone.getTimeZone("PST"));

System.out.println("String date:"+sdf.format(resultdate));
System.out.println("Date:"+sdf2.parse(sdf.format(resultdate)));

答案 4 :(得分:0)

三个字母的时区代码

避免使用三个字母的时区代码。它们既不标准也不独特。例如,IST表示印度标准时间爱尔兰标准时间。此外,这些代码旨在区分夏令时(DST),但这只会让人感到困惑。

使用正确的descriptive time zone names检索包含DST和其他问题的时区对象。

约达时间

java.util.Date&与Java捆绑在一起的日历类非常麻烦。避免他们。使用Joda-Time或与Java 8捆绑在一起的新java.time。*包。

在JodaTime中,DateTime对象确实知道自己的时区(与java.util.Date不同)。通常我们在Joda-Time中使用不可变类。因此,我们不是更改DateTime对象中的时区,而是根据旧的但具有指定差异创建一个新的 new DateTime对象。不同的时区可能就是这种差异。

以下是一些示例代码。

DateTimeZone timeZone_India = DateTimeZone.forID( "Asia/Kolkata" );
DateTimeZone timeZone_Ireland = DateTimeZone.forID( "Europe/Dublin" );
DateTimeZone timeZone_US_West_Coast = DateTimeZone.forID( "America/Los_Angeles" );

DateTime now = new DateTime( timeZone_India );

System.out.println( "now in India: " + now );
System.out.println( "now in Ireland: " + now.withZone( timeZone_Ireland ) );
System.out.println( "now in US West Coast: " + now.withZone( timeZone_US_West_Coast ) );
System.out.println( "now in UTC/GMT: " + now.withZone( DateTimeZone.UTC ) );

跑步时......

now in India: 2014-02-10T13:52:27.875+05:30
now in Ireland: 2014-02-10T08:22:27.875Z
now in US West Coast: 2014-02-10T00:22:27.875-08:00
now in UTC/GMT: 2014-02-10T08:22:27.875Z

java.time

同样的想法使用取代Joda-Time的java.time类。

Instant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位)。

Instant instant = Instant.now();

申请时区。

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );

instantzdt代表同一时刻,即时间轴上的同一点。通过不同区域wall-clock time的镜头可以看到每个区域。

通过指定格式化模式或让java.time自动本地化来生成String。

要进行本地化,请指定:

  • FormatStyle确定字符串的长度或缩写。
  • Locale确定(a)翻译日期名称,月份名称等的人类语言,以及(b)决定缩写,大小写,标点符号等问题的文化规范。< / LI>

示例:

Locale l = Locale.CANADA_FRENCH ; 
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL ).withLocale( l );
String output = zdt.format( f );