Java:使用时区变量将字符串转换为日期

时间:2012-03-02 22:08:33

标签: java

我编写了一个函数来将Date String(Thu,2012年3月1日13:57:06 -0600)转换为Date变量。 我依靠SimpleDateFormat进行转换。转换发生,但结果日期是“Thu Sep 01 11:00:06 GMT-08:00 2016”,我无法理解。我尝试了格式字符串仍然可以使用的不同选项。任何帮助赞赏。谢谢。

我为Format String尝试的选项是: 1)E,dd MMM yyyy HH:MM:ss Z. 2)EEE,dd MMM yyyy HH:MM:ss ZZZZ

private Date Convert_To_Date() {

        Date dt = null;

        String str = "Thu, 1 Mar 2012 13:57:06 -0600";
        SimpleDateFormat formatter = new SimpleDateFormat("E, dd MMM yyyy HH:MM:ss Z");

        try {
            dt = formatter.parse(str);
        }
        catch ( ParseException pe) {
            System.out.println(pe.getMessage());
        }

        //String strDt = dt.toString(); 
        System.out.println(dt);

        return dt;
    }

3 个答案:

答案 0 :(得分:3)

我认为问题只是因为你使用“M”而不是“m”。这对我来说很好:

import java.text.*;
import java.util.*;

public class Test {
    public static void main(String[] args) throws Exception {
        String text = "Thu, 1 Mar 2012 13:57:06 -0600";
        // Note the explicit locale. Let's not leave it as the system default :)
        DateFormat formatter = new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss Z", 
                                                    Locale.US);

        Date dt = formatter.parse(text);
        System.out.println(dt);
    }
}

(如sgmorrison所述,您也可以使用d代替dd,这样可以更准确地描述您的格式 - 但dd适用于此情况下的解析。)

答案 1 :(得分:2)

日期格式字符串中的几个小错误:

您在小时内匹配分钟的模式应为“mm”,而不是“MM”(与一年中的某个月匹配)。有关详细信息,请参阅SimpleDateFormat

此外,您在月份中匹配天数的模式应为“d”而不是“dd”,因为“模式字母数是最小位数,而较短的数字是零填充到此数量。解析时,除非需要分隔两个相邻的字段,否则忽略模式字母的数量。“

答案 2 :(得分:0)

TL;博士

ZonedDateTime.parse( 
    "Thu, 1 Mar 2012 13:57:06 -0600" ,    // Input complies with RFC 1123 & RFC 822.
    DateTimeFormatter.RFC_1123_DATE_TIME  // Hard-coded to English locale.
).toString()
  

2012-03-01T13:57:06-06:00

java.time

现代方法使用 java.time 类来取代麻烦的旧遗留日期时间类。

RFC 1123 / RFC 822

您的输入字符串恰好符合RFC 1123 / RFC 822java.time.DateTimeFormatter类为该格式定义了一个常量DateTimeFormatter.RFC_1123_DATE_TIME

String input = "Thu, 1 Mar 2012 13:57:06 -0600" ;
DateTimeFormatter f = DateTimeFormatter.RFC_1123_DATE_TIME ;
ZonedDateTime zdt = ZonedDateTime.parse( input , f ) ;
  

2012-03-01T13:57:06-06:00

那些RFC已经过时了。格式现在已经过时ISO 8601标准。旧的格式是可怕的:假设英语,容忍各种各样的内容,并且难以解析。

大多数现代协议和标准都使用ISO 8601格式将日期时间值作为文本进行交换。本标准定义的格式实用,即使跨文化也是明确的,易于通过机器解析,并且易于人类阅读以进行调试/记录。

java.time 类在解析/生成字符串时默认使用ISO 8601格式,如上面的示例所示。

关于 java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

如果JDBC driver符合JDBC 4.2或更高版本,您可以直接与数据库交换 java.time 对象。不需要字符串或java.sql。* classes。

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore