как преобразовать строку в дату и сохранить правильный формат

#java #string #datetime #date #simpledateformat

#java #строка #дата-время #Дата #simpledateformat

Вопрос:

Я читаю в String из текстового файла, который содержит дату в форме yyMMdd , затем я хочу преобразовать ее в type 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();
        }
  

Ответ №1:

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

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

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

Ответ №2:

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

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

Ответ №3:

Метод SimpleDateFormat.format всегда возвращает строку. Он представляет параметр ‘date’ в виде строки с указанным форматом. Например:

 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  
  

Это лучшая вещь для форматирования объекта даты.

Ответ №4:

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

И compareTo выполняет ожидаемое

Ответ №5:

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

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