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
问题:
sdf.format(resultdate)
按时区返回正确的日期和时间。但是,sdf.parse(sdf.format(resultdate))
没有按时区返回正确的日期和时间,如何解决此问题?答案 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
同样的想法使用取代Joda-Time的java.time类。
Instant
类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位)。
Instant instant = Instant.now();
申请时区。
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
instant
和zdt
代表同一时刻,即时间轴上的同一点。通过不同区域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 );