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