Java 如何在不知道格式的情况下将字符串转换为日期?
我有个问题。我正在尝试将一些字符串转换为日期,但我不知道日期的格式 它可能是Java 如何在不知道格式的情况下将字符串转换为日期?,java,date,format,Java,Date,Format,我有个问题。我正在尝试将一些字符串转换为日期,但我不知道日期的格式 它可能是yyyy.mm.dd hh:mm:ss或mm.dd.yy hh:mm:ss等等 如何将这些字符串转换为日期? 我试过这个: DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss"); Date d = (Date)formatter.parse(someDate); 但是当我打印出某个日期时,它是这样打印的:2010-08-05 12:42:4
yyyy.mm.dd hh:mm:ss
或mm.dd.yy hh:mm:ss
等等
如何将这些字符串转换为日期?
我试过这个:
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");
Date d = (Date)formatter.parse(someDate);
但是当我打印出某个日期时,它是这样打印的:2010-08-05 12:42:48.638 CEST,意思是yyyy.mm.dd hh:mm:ss
,然而当我运行上述代码时,日期对象现在变成Sat Jan 31 00:42:48 CET 11
,这至少说来很奇怪
你知道如何正确设置字符串的格式吗?你不能
如果你有日期
2010-08-05
,那么它可以是2010年8月5日,也可以是2010年5月8日-你需要知道日期格式(或者至少优先考虑一种格式)来区分它们。我唯一的猜测是,你应该先收集一些统计数据来确定格式
如果幸运的话,你会有类似“2010/08/13”这样的日期,可以毫不含糊地解析它你的问题与国际化有关。正如Kragen所回答的,你不能只解析未知格式的日期。虽然您可以扫描所有可能的区域设置并解析某些内容,但您不知道是否正确解析了它 只是一点i18n背景: 问:你能告诉我这个日期指的是哪一天、哪一个月、哪一年吗 09/11/10
答:不知道地点,你就不能。它可能是任何东西。9月11日在美国。11月9日在英国。等等。我同意克拉根的观点,即在一般情况下,没有正确的解决方案。但是,如果以下条件成立,您可以使用以下解决方案:
SimpleDateFormat
不是线程安全的):
公共类FlexibleDateParser{
private List threadLocals=new ArrayList();
公共FlexibleDateParser(列表格式、最终时区){
threadLocals.clear();
for(最终字符串格式:格式){
ThreadLocal dateFormatTL=新的ThreadLocal(){
受保护的SimpleDataFormat初始值(){
SimpleDataFormat sdf=新的SimpleDataFormat(格式);
设置时区(tz);
sdf.setLenient(错误);
返回sdf;
}
};
添加(dateFormatTL);
}
}
公共日期parseDate(字符串dateStr)引发ParseException{
for(ThreadLocal tl:threadLocals){
SimpleDataFormat sdf=tl.get();
试一试{
返回sdf.parse(dateStr);
}捕获(解析异常){
//忽略并尝试下一个日期分析器
}
}
//所有解析器都失败了
返回null;
}
}
如前所述,您至少需要有一个有序的候选模式列表。一旦有了它,就有了一个parseDate(String-dateString,String[]patterns)
方法,让您可以轻松地尝试日期字符串上的模式列表,并通过第一个匹配的模式对其进行解析:
public static Date parseDate(String str,
String[] parsePatterns)
throws ParseException
通过尝试各种不同的解析器来解析表示日期的字符串
解析将依次尝试每个解析模式。只有在解析整个输入字符串时,才会认为解析成功。如果没有匹配的解析模式,将引发ParseException
解析器将对解析的日期宽大处理
如果是协议;定义格式-也许ISO会激怒所有人,除了我们瑞典人
如果是用户的输入;让他们设置他们的区域设置。如果可以,请以完整格式显示解析的日期,以便用户可以进行验证,如2009年11月10日 这是一个基于美国日期格式的快速而肮脏的解决方案
public String compareDate( PaymentTxnRequest request ) throws ParseException {
Date debitDate= request.getPaymentTxn().getCrValDt();
Date now = new Date();
String response="";
SimpleDateFormat sdfDate = new SimpleDateFormat("dd/MM/yyyy");
String strCurrDate = sdfDate.format(now);
String strDebitDate = sdfDate.format(debitDate);
System.out.println("Current Date: " + strCurrDate);
Date currentDate = new SimpleDateFormat("dd/MM/yyyy").parse(strCurrDate);
Date txnDate = new SimpleDateFormat("dd/MM/yyyy").parse(strDebitDate);
System.out.println("C -> "+currentDate);
System.out.println("C -> "+txnDate);
if (txnDate!=null){
if (currentDate.equals(txnDate))
{
System.out.println("Valid Txn");
response="valid";
}
if (currentDate.after(txnDate))
{
System.out.println("--> Not Valid TXN Past");
response="notValid";
}
if (currentDateenter code here.before(txnDate)){
System.out.println("Future Valid TXn");
response="future";
}
}
return response;
}
public Date parseDate(String strDate) throws Exception
{
if (strDate != null && !strDate.isEmpty())
{
SimpleDateFormat[] formats =
new SimpleDateFormat[] {new SimpleDateFormat("MM-dd-yyyy"), new SimpleDateFormat("yyyyMMdd"),
new SimpleDateFormat("MM/dd/yyyy")};
Date parsedDate = null;
for (int i = 0; i < formats.length; i++)
{
try
{
parsedDate = formats[i].parse(strDate);
return parsedDate;
}
catch (ParseException e)
{
continue;
}
}
}
throw new Exception("Unknown date format: '" + strDate + "'");
}
public Date parseDate(字符串strDate)引发异常
{
if(strDate!=null&&!strDate.isEmpty())
{
SimpleDataFormat[]格式=
新SimpleDataFormat[]{新SimpleDataFormat(“MM dd yyyy”)、新SimpleDataFormat(“yyyyMMdd”),
新的简化格式(“MM/dd/yyyy”)};
日期parsedDate=null;
对于(int i=0;i
这是一个简单的解决方案,对我来说很有用。
这是一个简单的方法来解析日期,将字符串作为参数传递,并以您想要的任何格式解析它
String dateToConvert(String date) {
String strDate = "";
try {
//create SimpleDateFormat object with source string date format
DateFormat sdfSource = new SimpleDateFormat("yyyy-MM-dd");
//parse the string into Date object
Date d = sdfSource.parse(date);
LocalLog.e(LOG_TAG, d.toString());
//create SimpleDateFormat object with desired date format
SimpleDateFormat sdfDestination = new SimpleDateFormat(AppConstants.UNIVERSAL_DATE_FORMAT);
//parse the date into another format
strDate = sdfDestination.format(d);
LocalLog.e(LOG_TAG, strDate);
} catch (ParseException pe) {
System.out.println("Parse Exception : " + pe);
}
return strDate;
}
此答案是我对另一个问题的答案的副本,标记为此问题的副本 我曾经有一项任务,就是编写一段代码,解析一个日期格式未知的字符串。也就是说,我必须解析任何有效的日期格式。我写了一个项目,之后我写了一篇文章,描述了我的实现背后的想法。以下是文章的链接:。一般的想法是将您希望支持的所有模式写入到外部属性文件中,并从中读取它们,然后尝试按这些格式逐个解析您的字符串,直到成功或格式用尽为止。请注意,顺序也很重要,因为某些字符串可能对几种格式有效(美国/欧洲的差异)。优点是您可以在不更改代码的情况下不断向文件添加/删除格式。所以这样的项目可以
String dateToConvert(String date) {
String strDate = "";
try {
//create SimpleDateFormat object with source string date format
DateFormat sdfSource = new SimpleDateFormat("yyyy-MM-dd");
//parse the string into Date object
Date d = sdfSource.parse(date);
LocalLog.e(LOG_TAG, d.toString());
//create SimpleDateFormat object with desired date format
SimpleDateFormat sdfDestination = new SimpleDateFormat(AppConstants.UNIVERSAL_DATE_FORMAT);
//parse the date into another format
strDate = sdfDestination.format(d);
LocalLog.e(LOG_TAG, strDate);
} catch (ParseException pe) {
System.out.println("Parse Exception : " + pe);
}
return strDate;
}