如何在Java中将字符串转换为日期,无论系统格式是什么。

7

我正在尝试将一个日期字符串转换为Java的日期对象,而不考虑当前系统日期格式。这是因为我希望获取我的自定义日期格式以存储在数据库中。下面是我的代码,请给出建议。

public static String dateToString(String date){
    if(date.equals("")) return "";
    if(date == null || date.length() == 0){
        return "";
    }
    SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
    try {
        Date l_date =  format.parse(date);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(l_date);
        String year = String.format("%04d", calendar.get(Calendar.YEAR));
        String month = String.format("%02d", calendar.get(Calendar.MONTH));
        String day = String.format("%02d", calendar.get(Calendar.DATE));
        return year + month + day;
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return "";
    }
}

对于SimpleDateFormat,它只能解析我所听到的编码格式。

dateToString("16/04/2015");

它可以转换上述代码。但是,当我尝试使用以下格式时。
dateToString("Thursday, April 16, 2015");

我遇到了一个无法解析日期的错误:“Thursday, April 16, 2015”。


请使用return new SimpleDateFormat("yyyyMMdd").format(calendar.getTime());,因为日历中的月份是从0开始计数的。 - Joop Eggen
不要依赖字符串与数据库通信。对于日期时间值,请使用日期时间对象。从JDBC 4.2及更高版本开始,使用java.time类与PreparedStatement :: setObjectResultSet :: getObject - Basil Bourque
3个回答

4
您正在尝试将格式为EEEE,MMMM dd,yyyy的字符串转换为dd/MM/yyyy的格式...
首先,请使用正确的格式来转换您要转换的String,然后再使用任何您想要转换的格式进行转换...
SimpleDateFormat from = new SimpleDateFormat("EEEE, MMMM dd, yyyy");
SimpleDateFormat to = new SimpleDateFormat("dd/MM/yyyy");

String value = to.format(from.parse(dateString));

现在您可以使用类似于DateUtils.parseDate(String, String[])的工具,该工具允许提供多个不同的格式,但仍然受到您可能已知的限制。
更好的解决方案是直接在数据库中存储Date值。

谢谢@MadProgrammer。但是,我不想直接在数据库中存储日期值,因为客户端计算机可能有不同的日期格式,我只想在插入到数据库之前将它们转换回我的自定义格式。 - Thiha Zaw
这就是我的观点,将“日期”存储在数据库中,然后您就不必关心格式(也不应该),您应该在尽可能的情况下提供对象的格式化,以符合用户所期望的格式,而不是你想要的。 - MadProgrammer

0
尝试使用类似这样的代码:
public static String dateToString(String date){
    if(date.equals("")) return "";
    if(date == null || date.length() == 0){
        return "";
    }
    SimpleDateFormat formatIn = new SimpleDateFormat("dd/MM/yyyy");
    SimpleDateFormat formatOut = new SimpleDateFormat("yyyy-dd-MM");

    try {
        Date l_date =  formatIn.parse(date);
        String result = formatOut.format(l_date);
        return result;
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return "";
    }
}

但如果您想将一些数据放入数据库中,您也可以使用 java.sql.Date 而不是 String。

就像这样:

SimpleDateFormat format = new SimpleDateFormat();

Connection conn = ...
PreparedStatement ps = conn.prepareStatement("...");

long lDate = format.parse(sDate).getTime();
java.sql.Date dDate = new java.sql.Date(lDate);
ps.setDate(1, dDate);

0
  • 您正在向SimpleDateFormater传递错误的参数
  • 请使用SimpleDateFormat format = new SimpleDateFormat("EEEE, MMMM dd, yyyy")代替SimpleDateFormat to = new SimpleDateFormat("dd/MM/yyyy");
  • 这将解决您的无法解析日期问题。

谢谢@Ranjeet。但是,我的意思是我只想将任何日期格式转换为我的自定义格式。有没有办法将变量日期格式转换为特定格式? - Thiha Zaw
@Thiha Zaw:然后您需要为所有可能的组合编写正则表达式。 - Ranjeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接