как преобразовать строку в дату и сохранить правильный формат - PullRequest
1 голос
/ 07 ноября 2011

Я читаю в 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);, то строка будет содержать дату в формате, который я хотел бы видеть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 ]

3 голосов
/ 07 ноября 2011

Класс Date не имеет «внутреннего» формата, он представляет только элементы даты.Чтобы вывести его в определенном формате, вам нужно сделать так, как вы это сделали: String tDate = formatter1.format(date);

Причина, по которой вы думаете, что он имеет «неправильный формат», вероятно, заключается в том, что при попытке вывести его, он делаетtoString() по умолчанию, который не форматирует его так, как вы хотите.

Если вы дадите нам более подробную информацию о том, как вы хотите использовать эту дату (включая свой код), то мы могли быпредоставить предложения о том, как вставить в него форматер.

2 голосов
/ 07 ноября 2011

Метод SimpleDateFormat.format всегда возвращает строку.Он представляет параметр 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  

Лучше всего форматировать объект Date.

2 голосов
/ 07 ноября 2011

Date всегда хранит полную информацию, включая время. Если вы анализируете дату с SimpleDateFormat, который не содержит информацию о времени, эти поля будут установлены в 0, как в вашем примере.

Date не сохраняет саму информацию о формате.

1 голос
/ 07 ноября 2011

Вы можете попробовать что-то вроде:

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. Это должно заставить все ваши даты выглядеть так, как вы хотите.

1 голос
/ 07 ноября 2011

Написано с использованием 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);

И сравните с ожидаемым

...