如何解析不同时区的日期?

问题描述 投票:0回答:3

我正在尝试将

String
转换为
DateTime
值,在解析代码中的平面文件后,该值作为
Date
对象存在于平面文件中。

我已经编写了代码来做到这一点,但是当我格式化日期时,它总是给我一个日期,比指定值多 1 天,有时它会添加

5:30

下面是代码:

    DateFormat f = new SimpleDateFormat("EEE MMM dd HH:mm:ss zz yyyy");
    Date date = f.parse("Tue Aug 23 20:00:03 PDT 2011");
    System.out.println("---date----" + date);

上面的输出是

    ---date----Wed Aug 24 08:30:03 IST 2011  

您能告诉我这里出了什么问题吗?我在

SimplaDateFormat
类中使用的模式有问题还是代码有问题?

java date parsing simpledateformat date-conversion
3个回答
6
投票

您能让我知道这里出了什么问题吗?

当然。您实际上正在调用

date.toString()
,它不知道用于解析原始文本值的 SimpleDateFormat
任何事情
Date
只是 一个瞬间。它没有每个实例格式的概念。此外,它不知道时区。您在 PDT 中给出了一个值,然后对其进行解析...当您“打印”它时,它正在使用系统本地时区(IST)。这就是 Date.toString
always
所做的。 如果您想以特定方式格式化

Date

,在特定时区使用特定格式,请致电

DateFormat.format
    


3
投票

Java 将日期存储为 UTC 日期。 因此,当您解析 PDT 日期时,Java 会将其转换为 UTC 并在内部将其存储为 UTC 时间戳。 当您打印时,如果您不指定时区,它将默认为系统时区,在您的情况下将显示为 IST。

要指定准确的时区,请在 SimpleDateFormat 中指定:

DateFormat f = new SimpleDateFormat("EEE MMM dd HH:mm:ss zz yyyy"); f.setTimeZone(TimeZone.getTimeZone("PDT")); Date date = f.parse("Tue Aug 23 20:00:03 PDT 2011"); System.out.println("---date----" + f.format(date));



1
投票
date

。看例子


public static void main(String[] args){ Locale currentLocale = Locale.US; DateFormat f = new SimpleDateFormat("EEE MMM dd HH:mm:ss zz yyyy", currentLocale); Date date = null; Date today; try { today = new Date(); String result = f.format(today); System.out.println("Locale: " + currentLocale.toString()); System.out.println("Result: " + result); date = f.parse("Tue Aug 23 20:00:03 PDT 2011"); } catch (ParseException e) { e.printStackTrace(); } System.out.println("---date----" + f.format(date)); }

将会输出

Locale: en_US Result: Tue Sep 25 19:12:38 EEST 2012 ---date----Tue Aug 23 20:00:03 PDT 2011

现在,您已经修改了一些代码

public static void main(String[] args){ Locale currentLocale = Locale.US; DateFormat f = new SimpleDateFormat("EEE MMM dd HH:mm:ss zz yyyy", currentLocale); DateFormat f2 = new SimpleDateFormat("EEE MMM dd HH:mm:ss zz yyyy", currentLocale); Date date = null; Date today; try { today = new Date(); String result = f.format(today); System.out.println("Locale: " + currentLocale.toString()); System.out.println("Result: " + result); date = f.parse("Tue Aug 23 20:00:03 PDT 2011"); System.out.println("---date----" + f.format(date)); System.out.println("---date----" + f2.format(date)); } catch (ParseException e) { e.printStackTrace(); } }

输出到

Locale: en_US Result: Tue Sep 25 20:42:10 EEST 2012 ---date----Tue Aug 23 20:00:03 PDT 2011 ---date----Wed Aug 24 06:00:03 EEST 2011

似乎 
SimpleDateFormat

不关心时区,即使指定了

'z'
模式。它在解析输入时设置时区。这就是我可以描述的奇怪行为。那么使用
'z'
模式似乎已经过时并导致不可预测的结果。

因此设置

TimeZone

将解决问题


f2.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));

	
© www.soinside.com 2019 - 2024. All rights reserved.