Java 字符串到日期为止,未指定格式
我想把字符串转换成日期,这很简单。但我想做的是不知道日期格式 这里有一种情况:假设我有100个日期,所有日期的格式都相同,但我想编写一个Java程序来为我找出这种格式。这个程序的结果应该给我一个所有可能格式的列表 例如:Java 字符串到日期为止,未指定格式,java,Java,我想把字符串转换成日期,这很简单。但我想做的是不知道日期格式 这里有一种情况:假设我有100个日期,所有日期的格式都相同,但我想编写一个Java程序来为我找出这种格式。这个程序的结果应该给我一个所有可能格式的列表 例如: 06-06-2006 06-06-2009 ... 06-13-2001 <- 99th record 06-06-2006 06-06-2009 ... 06-13-2001尝试使用“准备所有可能的格式”并计算解析结果。尝试使用“准备所有可能的格式”并计
06-06-2006
06-06-2009
...
06-13-2001 <- 99th record
06-06-2006
06-06-2009
...
06-13-2001尝试使用“准备所有可能的格式”并计算解析结果。尝试使用“准备所有可能的格式”并计算解析结果。解决方案可以是功能性Java,如中所述。解决方案可以是功能性Java,如中所述,创建您知道的一组格式(日期格式),然后测试每一行,看看哪些格式可以理解每一行。你应该有一系列的可能性
public class DateFormatDetector {
private static final Set<String> DATE_FORMATS = new HashSet<String>();
static {
DATE_FORMATS.add("yyyy-MM-dd");
DATE_FORMATS.add("dd-MM-yyyy");
DATE_FORMATS.add("MM-dd-yyyy");
}
public static Set<String> getPossibleDateFormats(List<String> dates) {
Set<SimpleDateFormat> candidates = new HashSet<SimpleDateFormat>();
for (String df : DATE_FORMATS) {
SimpleDateFormat candidate = new SimpleDateFormat(df);
candidate.setLenient(false);
candidates.add(candidate);
}
for (String date : dates) {
Iterator<SimpleDateFormat> it = candidates.iterator();
while (it.hasNext()) {
SimpleDateFormat candidate = it.next();
try {
// try to parse the string as a date
candidate.parse(date);
}
catch (ParseException e) {
// failed to parse, so this format is not suitable
it.remove();
}
}
}
Set<String> results = new HashSet<String>();
for (SimpleDateFormat candidate : candidates)
results.add(candidate.toPattern());
return results;
}
}
公共类DateFormatDetector{
私有静态最终设置日期\格式=新HashSet();
静止的{
添加日期格式(“yyyy-MM-dd”);
添加日期格式(“dd-MM-yyyy”);
添加日期格式(“MM dd yyyy”);
}
公共静态集getPossibleDateFormats(列表日期){
Set候选者=新的HashSet();
for(字符串df:DATE\u格式){
SimpleDataFormat候选者=新SimpleDataFormat(df);
候选人。setLenient(假);
候选人。添加(候选人);
}
用于(字符串日期:日期){
Iterator it=candidates.Iterator();
while(it.hasNext()){
SimpleDataFormat candidate=it.next();
试一试{
//尝试将字符串解析为日期
候选解析(日期);
}
捕获(解析异常){
//无法分析,因此此格式不适用
it.remove();
}
}
}
Set results=new HashSet();
for(SimpleDataFormat候选者:候选者)
results.add(candidate.toPattern());
返回结果;
}
}
创建一组您知道的格式(日期格式),然后测试每一行,看看哪些格式可以理解每一行。你应该有一系列的可能性
public class DateFormatDetector {
private static final Set<String> DATE_FORMATS = new HashSet<String>();
static {
DATE_FORMATS.add("yyyy-MM-dd");
DATE_FORMATS.add("dd-MM-yyyy");
DATE_FORMATS.add("MM-dd-yyyy");
}
public static Set<String> getPossibleDateFormats(List<String> dates) {
Set<SimpleDateFormat> candidates = new HashSet<SimpleDateFormat>();
for (String df : DATE_FORMATS) {
SimpleDateFormat candidate = new SimpleDateFormat(df);
candidate.setLenient(false);
candidates.add(candidate);
}
for (String date : dates) {
Iterator<SimpleDateFormat> it = candidates.iterator();
while (it.hasNext()) {
SimpleDateFormat candidate = it.next();
try {
// try to parse the string as a date
candidate.parse(date);
}
catch (ParseException e) {
// failed to parse, so this format is not suitable
it.remove();
}
}
}
Set<String> results = new HashSet<String>();
for (SimpleDateFormat candidate : candidates)
results.add(candidate.toPattern());
return results;
}
}
公共类DateFormatDetector{
私有静态最终设置日期\格式=新HashSet();
静止的{
添加日期格式(“yyyy-MM-dd”);
添加日期格式(“dd-MM-yyyy”);
添加日期格式(“MM dd yyyy”);
}
公共静态集getPossibleDateFormats(列表日期){
Set候选者=新的HashSet();
for(字符串df:DATE\u格式){
SimpleDataFormat候选者=新SimpleDataFormat(df);
候选人。setLenient(假);
候选人。添加(候选人);
}
用于(字符串日期:日期){
Iterator it=candidates.Iterator();
while(it.hasNext()){
SimpleDataFormat candidate=it.next();
试一试{
//尝试将字符串解析为日期
候选解析(日期);
}
捕获(解析异常){
//无法分析,因此此格式不适用
it.remove();
}
}
}
Set results=new HashSet();
for(SimpleDataFormat候选者:候选者)
results.add(candidate.toPattern());
返回结果;
}
}
这个问题太宽泛了,你能告诉我们你为什么需要这样做的背景,或者你到目前为止尝试过的一些示例代码吗?如果你的问题是家庭作业/项目,请将其标记为家庭作业/项目。我现在已经给它加了标签,但是事先知道是很有用的,因为答案可以被框起来更有用。一、 例如,这里可能没有提供完整的解决方案。这个问题太广泛了,你能告诉我们你为什么需要这样做的背景,或者你到目前为止尝试过的一些示例代码吗?如果你的问题是家庭作业/项目,那么请将其标记为家庭作业/项目。我现在已经给它加了标签,但是事先知道是很有用的,因为答案可以被框起来更有用。一、 例如,此处可能没有提供完整的解决方案。请看一看ptomli示例。请看一看ptomli示例。HII我添加了另一个类,当我输入20-12-1988或任何日期时,它会提供所有日期格式。。即使我输入了一个错误的日期,它仍然会给我date_格式中提到的所有可能的日期。我已经使用你的类在我的主类中调用了我的函数。对不起,我忽略了将Lenence设置为off。请参阅candidate.setLenient(false)
现在在创建SimpleDataFormat
时添加。这里的一个快速测试似乎很好。谢谢你,ptmoli。它现在工作得很好。但是,如果我有一个输入字符串,如20-12-1988 IST 00:00:00,它会给我一个尽可能的输出日期格式==[dd-MM-yy,dd-MM-yyyy-zzz hh:MM:ss,dd-MM-yyyy]。即使我不包括时间戳并输入一个字符串06-06-06,它也会给我一个输出dd-MM-yyyy,dd-MM-yy,即使输出应该只为dd-MM-yyyDateFormat。parse(string)
不一定使用整个字符串,这意味着一个简单的格式可能,例如,在忽略时间的情况下解析出日期。如果“yyy”与“06”匹配,则这符合SimpleDataFormat的文档。“对于格式化(一年),如果模式字母数为2,则年份将被截断为2位;否则它将被解释为一个数字。”您可能会发现,仅用格式解析字符串可能不足以过滤模式。您可以尝试比较字符串长度,并重新格式化解析的日期。我怀疑它是否会准确我添加了另一个类,当我输入20-12-1988或任何日期时,它会给出所有的日期格式。。即使我输入了一个错误的日期,它仍然会给我所有的时间