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


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))没有按照时区返回正确的日期和时间,如何解决这个问题?

Date类仅仅是对'epoch'(1970年1月1日,00:00:00 GMT)之后的毫秒数的一个薄包装。它不存储任何时区信息。在最后一次调用中,您将日期实例添加到隐式调用toString()方法的StringtoString()方法将使用默认时区来创建表示实例的String(因为它不存储任何时区信息)。尝试修改最后一行以避免使用toString()方法。

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

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

不幸的是Java date只返回GMT格式的时间。当您希望在前端或其他地方显示时,您需要使用在step1中生成的格式化字符串。

试试下面的代码,会成功的

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

三字母时区代码

避免使用三个字母的时区代码。它们既不标准化,也不独特。例如,IST表示印度标准时间爱尔兰标准时间。此外,这些代码是为了区分日光节约时间(DST),但这只会混淆事情。

使用适当的描述性时区名称来检索包含DST和其他问题的时区对象。

<标题> Joda-Time h1> java.util.Date &与Java绑定的日历类是出了名的麻烦。避免它们。使用jdbc - time或新的java.time。

在JodaTime中,DateTime对象真正知道它自己的时区(不像java.util.Date)。通常我们在jdbc中使用不可变类。因此,我们不是在DateTime对象中更改时区,而是在旧的DateTime对象的基础上创建一个新的新的 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 h1> 用java也是同样的想法。time类取代了Joda-Time。

Instant类表示UTC时间轴上的时刻,分辨率为纳秒(最多九(9)位小数)。

Instant instant = Instant.now();

应用时区

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

instantzdt代表同一时刻,在时间线上的同一点。每一个都是通过不同地区的挂钟时间来观察的。

通过指定格式化模式或让java。时间自动定位。

要进行本地化,请指定:

  • FormatStyle来确定字符串的长度或缩写。
  • Locale以确定(a)用于翻译日期、月份等的人类语言,以及(b)决定缩写、大写、标点等问题的文化规范。

的例子:

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

相关内容

  • 没有找到相关文章

最新更新