2012-03-02 142 views
0

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

我已经尝试了格式字符串中的选项是: 1)E,DD MMM YYYY HH:MM:SSŽ 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

我认为问题只是你用“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作品在这种情况下解析。)

2

在你的日期格式字符串一对夫妇的小的bug:

您的匹配在小时分应该是“毫米”,而不是“MM”(这符合今年月)模式。有关详细信息,请参见SimpleDateFormat。 “

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

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的。时间取代麻烦的旧的遗留日期 - 时间类的类。

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.Date,Calendar,& SimpleDateFormat

Joda-Time项目,现在在maintenance mode,建议迁移到java.time类。请参阅Oracle Tutorial。并搜索堆栈溢出了很多例子和解释。规格是JSR 310

随着JDBC driverJDBC 4.2或更高版本相符时,你可以交换java.time直接对象与数据库。无需字符串或java.sql。*类。

从何处获取java.time类?

ThreeTen-Extra项目与其他类扩展java.time。这个项目是未来可能增加java.time的一个试验场。您可以在这里找到一些有用的类,如Interval,YearWeek,YearQuartermore