如何将字符串转换为日期并保持格式正确

时间:2011-11-07 14:08:38

标签: java string datetime date simpledateformat

我正在使用String来自文本文件,其中包含yyMMdd形式的日期我想将其转换为date类型但是当我这样做时会丢失它的格式。这是我尝试过的一个例子

String strDate = matcher.group(10); // strDate would contain 111107

SimpleDateFormat formatter1 = new SimpleDateFormat("yyMMdd");
Date date = formatter1.parse(strDate); // after parsing it, the format changes to Thu Nov 03 00:00:00 EDT 2011

但是,如果我将date并将其放回到类似String tDate = formatter1.format(date);的字符串中,那么该字符串将包含ID格式的日期,以便查看111107

有没有办法可以做到这一点?也许如果我可以调用format函数来返回date对象而不是String,谢谢。

修改 我从文件中读取日期列表并将它们加载到地图中然后将这些日期与当前日期进行比较,该日期也是yyMMdd格式,然后如果地图中的日期早于一周前比当前日期我提示用户输入,然后以yyMMdd格式将日期和其他相关信息写入文件。我使用地图的原因是文本文件的每一行都包含一些信息和一个唯一的名称,我比较了该特定数据行的日期,因此我做了map.get(aName)

这是代码,希望它有所帮助

dbConnect();
            stmt = conn.createStatement();
            String query = "select * from OBJECT_BAC_EV where instance = 12";//VALUE <> 'Normal'";
            rslt = stmt.executeQuery(query);

            Calendar currentDate = Calendar.getInstance();
            SimpleDateFormat formatter = new SimpleDateFormat("yyMMdd");
            String dateNow = formatter.format(currentDate.getTime());
            Date curDate = (Date)formatter.parse(dateNow);
            currentDate.setTime(curDate);
            currentDate.add(Calendar.DAY_OF_MONTH, -7);
            dateNow = formatter.format(currentDate.getTime());
            curDate = (Date)formatter.parse(dateNow);

            Calendar cDate = Calendar.getInstance();
            SimpleDateFormat f = new SimpleDateFormat("yyMMdd");
            String strDate = f.format(cDate.getTime());

            while(rslt.next())
            {
                System.out.println(rslt.getRow());

                String aValue = rslt.getString("VALUE");
                String aName = rslt.getString("NAME");
                String aObjRef = rslt.getString("ObjRef");


                if(aNoteMap.containsKey(aName))
                {

                    String n = aNoteMap.get(aName);
                    if(aDateMap.get(aName).before(curDate))
                    {
                        int answer = JOptionPane.showConfirmDialog(null, "Would you like to use last weeks note? " + n, "Hey", JOptionPane.YES_NO_OPTION);
                        if( answer == JOptionPane.YES_OPTION)
                        {
                            output.write(aName + "    "  + aObjRef + "    "  + aValue + "    "  + aDateMap.get(aName) + "    "
                                     + n  + (System.getProperty("line.separator")));
                        }
                        else if( answer == JOptionPane.NO_OPTION)
                        {
                            String newNote = JOptionPane.showInputDialog("Enter new note");
                            output.write(aName + "    "  + aObjRef + "    "  + aValue + "    "  + aDateMap.get(aName) + "    "
                                     + newNote  + (System.getProperty("line.separator")));
                        }
                    }
                    else
                        output.write(aName + "    "  + aObjRef + "    "  + aValue + "    "  + aDateMap.get(aName) + "    "
                                 + n  + (System.getProperty("line.separator")));
                }
                else
                    output.write(aName + "    "  + aObjRef + "    "  + aValue + "    "  + strDate + "    "
                            + ""  + (System.getProperty("line.separator")));
            }
            System.out.println("its closing output..");
            output.close();
        }

5 个答案:

答案 0 :(得分:3)

Date类没有“内部”格式,它只表示日期元素。要使用特定格式输出,您需要按照以下方式进行输出:String tDate = formatter1.format(date);

您认为它具有“错误格式”的原因可能是因为当您尝试输出它时,默认情况下会执行toString(),而不会按照您希望的方式对其进行格式化。

如果您向我们提供有关如何使用该日期的更多详细信息(包括您的代码),那么我们可能会提供有关如何将格式化程序注入其中的建议。

答案 1 :(得分:2)

Date始终存储包括时间在内的完整信息。如果使用不包含时间信息的SimpleDateFormat解析日期,则这些字段将设置为0,如示例所示。

Date本身不存储任何格式信息。

答案 2 :(得分:2)

SimpleDateFormat.format方法始终返回String。它将'date'参数表示为String,具有指定的格式。例如:

SimpleDateFormat sdf = new SimpleDateFormat('yyMMdd');
Date date = sdf.parse("110510");
String sDate = sdf.format(date); //"110510"

SimpleDateFormat sdf2 = new SimpleDateFormat('yyyy.MM.dd');
String sDate2 = sdf2.format(date); //2011.05.10  

格式化日期对象是最好的选择。

答案 3 :(得分:1)

使用joda-time撰写,希望如此:

String str = "110107";
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
  .appendYearOfCentury(2, 2)
  .appendMonthOfYear(2)
  .appendDayOfWeek(2)
  .toFormatter();

DateTime dateFromDB = formatter.parseDateTime(str);//create DateTime instance
System.out.println("Date:" + formatter.print(dateFromDB));//toString in required format

它还有许多其他好处,显然它将取代现有的Java日期库,这些库在即将发布的Java版本中一直很痛苦。

其中一个好处是

DateTime now = new DateTime();
Integer compared = now.minusWeeks(1).compareTo(dateFromDB);

并且比较要做expected

答案 4 :(得分:1)

您可以尝试以下方式:

class MyDate extends java.util.Date {
  static final SimpleDateFormat yymmddFormat = new SimpleDateFormat("yyMMdd");

  public MyDate (String s) throws ParseException {
    super(yymmddFormat.parse(s).getTime());
  }

  public String toString () {
    return yymmddFormat.format(this);
  }
}

在目前使用Date对象的任何地方使用此类。这应该使您的所有日期看起来都符合您的要求。