2010-02-02 76 views
2

当我在1949年之前将一个日期传入波节点方法时,我遇到了java日期问题。 我已经返回的日期是例如2049年,我知道它与日期格式有关,并认为使用yyyy而不是RRRR会修复它。但我只是不明白为什么或如何改变它。任何帮助将非常apreciatedJava日期问题

public static java.sql.Date parseDate(String date) throws ParseException { 
    if (date != null) { 
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy"); 
    return new java.sql.Date(dateFormat.parse(date).getTime()); 
    } 
    return null; 
} 

感谢乔恩

+3

'String date'是怎么样的?注释:1)您应该使用'java.util.Date'而不是'java.sql.Date'。 2)你应该使用Joda时间而不是'java.util.Date'。 – BalusC 2010-02-02 12:46:19

+4

“我的java日期有问题” - 没关系,每个人都有 – 2010-02-02 13:06:23

回答

2

让我格式化为你..

public static java.sql.Date parseDate(String date) throws ParseException { 
    if (date != null) { 
     SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy"); 
     return new java.sql.Date(dateFormat.parse(date).getTime()); 
    } 
    return null; 
} 

这我怀疑是你想要的...

private Date convertDate() throws ParseException 
{ 
    String dateStr = "21-02-2010"; 
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy"); 
    Date date = null; 
    if (dateStr != null) 
    { 
     date = new Date(dateFormat.parse(dateStr).getTime()); 
    } 

    System.out.println(date); 
    return date; 
} 

对于21-02-2010你会得到... 星期日2月21日00:00:00 GMT 2010

为21-02-1938,你会得到... 周一2月21日00:00:00 GMT 1938年

这是否帮助?我可能是因为你在你的代码中有MMM。

0

TL;博士

java.sql.Date.valueOf( 
    LocalDate.parse("12-Jan-23" , DateTimeFormatter.ofPattern("dd-MMM-uuuu" , Locale.US)) 
) 

时区

你的代码忽略时区的关键问题。确定一个日期需要一个时区。对于任何特定的时刻,日期因地区而异。

您的代码使用始终使用UTC的Date。因此,从错误名称Date级别生成的日期值对于UTC准确,但对于其他时区(例如America/MontrealAsia/Kolkata)无效。

使用java.time

现代的方式做到这一点的工作是与取代的麻烦旧的遗留日期时间类java.time类。

LocalDate类代表没有时间和没有时区的仅有日期的值。

要解析传入的字符串,请使用DateTimeFormatter定义格式模式。指定Locale作为翻译月份名称时使用的人类语言。

DateTimeFormatter f = DateTimeFormatter.ofPattern("dd-MMM-uuuu" , Locale.US); 
LocalDate localDate = LocalDate.parse("12-Jan-2017" , f); 

使用JDBC 4.2及更高版本,可以用setObjectgetObject方法直接通过LocalDate到数据库。

对于尚未更新的JDBC驱动程序,请回退到java.sql类型。

java.sql.Date sqlDate = java.sql.Date.valueOf(localDate); 
LocalDate localDate = sqlDate.toLocalDate(); 

关于java.time

java.time框架是建立在Java 8和更高版本。这些类取代了日期时间类legacy,如java.util.Date,Calendar,& SimpleDateFormat

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

从何处获取java.time类?

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