5

我正在尝试从字符串中解析日期并获取长值。长值将稍后发送到 SQL 查询。

这是我的代码:

String dayDate = "28-02-2013";            
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
Date day = new Date();
try {
    day = sdf.parse(dayDate);
} catch (ParseException pe) {
    pe.printStackTrace();
}
System.out.println("day : "+day.toString()+ "  long : " + day.getTime());

给出以下输出:

day : Thu Feb 28 00:00:00 EET 2013  long : 1362002400000

这是正确的,但不是我想要的,因为长值导致格林威治标准时间 2013 年 2 月 27 日星期三 22:00:00 ( http://www.epochconverter.com/ )(我在 GMT+2 时区)。我需要将正确的长值发送到 sql。

有没有办法在不使用外部库的情况下解决这个问题?

4

5 回答 5

5

SimpleDateFormat 是区域感知的,这意味着它解析的日期在您的时区中。格林威治标准时间 + 2 的 2 月 28 日午夜实际上是格林威治标准时间 2 月 27 日晚上 10 点,长值 1362002400000。我会添加这个来正确解析(不会打扰使用日历):

sdf.setTimeZone(TimeZone.getTimeZone("GMT"))

同样,当您打印此日期时,它使用 SimpleDateFormat,这就是您可以在输出中看到 EET 的原因。

将它传递给数据库是一个不同的故事,但一旦你做对了。

于 2013-02-15T12:58:33.703 回答
1

您正在Date日期和时间的文本和内部 ( ) 表示之间进行转换,而没有明确说明时区。那永远不会顺利

于 2013-02-15T13:03:12.437 回答
1

用于DateFormat.setCalendar(Calendar cal)设置以 GMT 作为其时区的日历,或DateFormat.setTimeZone(TimeZone zone)与 GMT 时区一起使用。这将确保生成的日期将是 GMT 而不是 EET 中的 00:00:00。

于 2013-02-15T12:56:46.837 回答
1

如果将时区说明符添加到字符串中,则可以强制 java 使用 GMT 进行转换:

String dayDate = "28-02-2013";            
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy z"); // z is a timezone specifier
Date day = new Date();
try {
    day = sdf.parse(dayDate + " GMT"); // Use GMT timezone.
} catch (ParseException pe) {
    pe.printStackTrace();
}
System.out.println("day : "+day.toString()+ "  long : " + day.getTime());
于 2013-02-15T12:59:28.527 回答
0
Calendar calendar = Calendar.getInstance();
    calendar.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));
    Date date = calendar.getTime();

使用您的时区字符串:

时区

于 2013-02-15T12:58:54.313 回答