gpt4 book ai didi

java - JDK 和 joda-time 日期格式化程序 : how to consider day light savings time

转载 作者:行者123 更新时间:2023-12-01 15:40:35 24 4
gpt4 key购买 nike

@Jon Skeet,我按照您的推荐下载了 Joda-Time,Date parsing/formatting with TimeZone and SimpleDateFormat give different results around DST switch ,并将其添加到我的 Java EE/JSF 项目中,尝试使用 DateTime 和 DateTimeFormatter,它们返回与 JDK 6 相同的结果(见下文),因为现在 EST 时区(美国/东部)这里是夏令时.

订单编号 0739 行程日期 11/11/2011 至 11/12/2011 客户编号 1004

行程日期/时间:2011年11月11日 05:00 PM报告日期/时间:2011 年 11 月 11 日 04:45 PM返回日期/时间:11/13/2011 02:00 AM

代码如下:

public String getDateFromDateTime (Date date, Boolean display) throws ParseException {

/*
* SimpleDateFormat working as designed, but pf_ordersController.selected.returnDateTime displaying incorrect date/time
*
* see below from /orders/pf_View.xhtml
* pf_ordersController.selected.returnDateTime (displayed on JSF page) = 11/13/2011 02:00 AM
*
* ORDER # 0739 Trip Date 11/11/2011 to 11/12/2011 Customer # 1004
*
* Trip Date/Time: 11/11/2011 05:00 PM Report Date/Time: 11/11/2011 04:45 PM Return Date/Time: 11/13/2011 02:00 AM
*
* orders.returnDateTime (stored in database) = 11/12/2011 21:00:00 (9:00 PM)
* SimpleDateFormat converts orders.returnDateTime to 11/12/2011 (working as designed)
*
* https://stackoverflow.com/questions/2356672/date-parsing-formating-with-timezone-and-simpledateformat-problem-around-dst-swi
*
DateFormat formatter;
String myDate;

if (display)
formatter = new SimpleDateFormat("MM/dd/yyyy");
else
formatter = new SimpleDateFormat("yyyy-MM-dd");

myDate = formatter.format(date);
*
*/

DateTimeFormatter dtFormatter;

if (display)
dtFormatter = DateTimeFormat.forPattern("MM/dd/yyyy");
else
dtFormatter = DateTimeFormat.forPattern("yyyy-MM-dd");

DateTime dt = new DateTime(date);
String myDate = dt.toString(dtFormatter);

System.out.println("OrderDisplayUtil.java:getDateFromDateTime(" + date + ", " + display + "): " + "myDate = " + myDate);

return myDate;

}

请帮忙。谢谢。

最佳答案

请具体解释您的方法所遇到的问题。您的输入值是什么,您期望的输出值是什么。作为开发人员,您应该以测试的形式表达这一点。

@Test
public void testGetDateFromDateTime() {
DateTimeZone timezone = DateTimeZone.forID("US/Eastern");
Date date = new DateTime(2011, 11, 11, 17, 0, 0, 0, timezone).toDate();

String formattedDate = unitUnderTest.getDateFromDateTime(date, true);

Assert.assertEquals(formattedDate, "11/11/2011");
}

您的问题是您没有明确指定要格式化日期的时区。在这种情况下,Java 将采用运行 JVM 的操作系统上设置的时区。例如,如果您想在新加坡运行的系统上使用 +08:00 时区格式化美国/东部地区的日期/时间 2011/11/11 16:45。系统会将日期/时间解释为 2011/11/12 06:00,这表示完全相同的时间点。然后系统将使用格式化程序并给出“11/12/2011”。

让我们通过指定您要使用的时区来解决此问题:

public String getDateFromDateTime(Date date, Boolean display) {

DateTimeFormatter dtFormatter;

if (display)
dtFormatter = DateTimeFormat.forPattern("MM/dd/yyyy");
else
dtFormatter = DateTimeFormat.forPattern("yyyy-MM-dd");

DateTimeZone timeZone = DateTimeZone.forID("US/Eastern");
DateTime dt = new DateTime(date, timeZone);
String myDate = dt.toString(dtFormatter);

return myDate;
}

另请注意,美国夏令时于 11 月 6 日结束。

关于java - JDK 和 joda-time 日期格式化程序 : how to consider day light savings time,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8109450/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com