Как преобразовать строку в дату с помощью SimpleDateFormat?
у меня есть этот фрагмент кода:
DateFormat formatter1;
formatter1 = new SimpleDateFormat("mm/DD/yyyy");
System.out.println((Date)formatter1.parse("08/16/2011"));
когда я запускаю это, я получаю это как результат:
Sun Jan 16 00:10:00 IST 2011
Я ожидал:
Tue Aug 16 "Whatever Time" IST 2011
Я хочу сказать, что я не получаю в месяц, как ожидалось. В чем ошибка?
10 ответов
попробуйте это:
new SimpleDateFormat("MM/dd/yyyy")
-
MM
- "месяц" (неmm
) -
dd
"день" (неDD
)
это все javadoc для SimpleDateFormat
FYI, причина, по которой ваш формат по-прежнему является допустимым форматом даты, заключается в том, что:
-
mm
это "минуты" -
DD
"день в году"
кроме того, вам не нужно приведение к Date
... это уже is a Date
(или взрывается):
public static void main(String[] args) throws ParseException {
System.out.println(new SimpleDateFormat("MM/dd/yyyy").parse("08/16/2011"));
}
выход:
Tue Aug 16 00:00:00 EST 2011
вуаля!
м - мин м - месяцев
Letter Date or Time Component Presentation Examples
G Era designator Text AD
y Year Year 1996; 96
M Month in year Month July; Jul; 07
w Week in year Number 27
W Week in month Number 2
D Day in year Number 189
d Day in month Number 10
F Day of week in month Number 2
E Day in week Text Tuesday; Tue
a Am/pm marker Text PM
H Hour in day (0-23) Number 0
k Hour in day (1-24) Number 24
K Hour in am/pm (0-11) Number 0
h Hour in am/pm (1-12) Number 12
m Minute in hour Number 30
s Second in minute Number 55
S Millisecond Number 978
z Time zone General time zone Pacific Standard Time; PST; GMT-08:00
Z Time zone RFC 822 time zone -0800
используйте приведенную ниже функцию
/**
* Format a time from a given format to given target format
*
* @param inputFormat
* @param inputTimeStamp
* @param outputFormat
* @return
* @throws ParseException
*/
private static String TimeStampConverter(final String inputFormat,
String inputTimeStamp, final String outputFormat)
throws ParseException {
return new SimpleDateFormat(outputFormat).format(new SimpleDateFormat(
inputFormat).parse(inputTimeStamp));
}
использование образца следующим образом:
try {
String inputTimeStamp = "08/16/2011";
final String inputFormat = "MM/dd/yyyy";
final String outputFormat = "EEE MMM dd HH:mm:ss z yyyy";
System.out.println(TimeStampConverter(inputFormat, inputTimeStamp,
outputFormat));
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String newstr = "08/16/2011";
SimpleDateFormat format1 = new SimpleDateFormat("MM/dd/yyyy");
SimpleDateFormat format = new SimpleDateFormat("EE MMM dd hh:mm:ss z yyyy");
Calendar c = Calendar.getInstance();
c.setTime(format1.parse(newstr));
System.out.println(format.format(c.getTime()));
очень простой пример.
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MM-yyyy");
Date date = new Date();
Date date1 = new Date();
try {
System.out.println("Date1: "+date1);
System.out.println("date" + date);
date = simpleDateFormat.parse("01-01-2013");
date1 = simpleDateFormat.parse("06-15-2013");
System.out.println("Date1 is:"+date1);
System.out.println("date" + date);
} catch (Exception e) {
System.out.println(e.getMessage());
}
вы можете решить проблему очень просто, как Сначала преобразовать заданную строку в объект Date например:
java.util.Date date1 = new Date("11/19/2015");
SimpleDateFormat formatter = new SimpleDateFormat("MMM dd yyyy HH:mma");
String format = formatter.format(date);
System.out.println(format);
этот кусок кода помогает конвертировать туда и обратно
System.out.println("Date: "+ String.valueOf(new Date()));
SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String stringdate = dt.format(new Date());
System.out.println("String.valueOf(date): "+stringdate);
try {
Date date = dt.parse(stringdate);
System.out.println("parse date: "+ String.valueOf(date));
} catch (ParseException e) {
e.printStackTrace();
}
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("MM/dd/uuuu");
System.out.println(LocalDate.parse("08/16/2011", dateFormatter));
выход:
2011-08-16
я вкладываю современный ответ. ответ от Bohemian правильно и был хорошим ответом, когда он был написан 6 лет назад. Теперь заведомо хлопотное SimpleDateFormat
класс давно устарел, и у нас намного лучше в java.time
, современный API даты и времени Java. Я настоятельно рекомендую вам использовать это вместо старых классов даты и времени.
что пошло не так в вашей код?
когда я разбора 08/16/2011
используя ваш фрагмент, я получаю Sun Jan 16 00:08:00 CET 2011
. Поскольку строчные mm
в течение нескольких минут, я получаю 00:08:00
(8 минут после полуночи), и с прописных DD
это для Дня года, я получаю 16 января.
на java.time
слишком строки шаблона формата чувствительны к регистру, и нам нужно было использовать верхний регистр MM
для месяца и строчного DD для дня месяца.
вопрос: Могу ли я использовать java.время с моей версией Java?
да, java.time
отлично работает на Java 6 и позже и на старых и новых устройствах Android.
- в Java 8 и более поздних версиях и на новых устройствах Android (от уровня API 26, мне сказали) современный API поставляется встроенным.
- в Java 6 и 7 получите Threeten Backport, backport новых классов (ThreeTen для JSR 310; см. Ссылки внизу).
- на (Старше) Android использовать Android издание ThreeTen Backport. Это называется ThreeTenABP. И убедитесь, что вы импортируете классы даты и времени из
org.threeten.bp
С подпакетами.
ссылки
-
Oracle учебник: дата и время объясняя, как использовать
java.time
. -
запрос спецификации Java (JSR) 310, где
java.time
была впервые описана. -
проект Threeten Backport на базу
java.time
к Java 6 и 7 (ThreeTen для JSR-310). - ThreeTenABP, Android издание ThreeTen Backport
- вопрос: Как использовать ThreeTenABP в проекте Android С очень подробного объяснения.
String localFormat = android.text.format.DateFormat.getBestDateTimePattern(Locale.getDefault(), "EEEE MMMM d");
return new SimpleDateFormat(localFormat, Locale.getDefault()).format(localMidnight);
возвращает формат, основанный на языке устройства. Обратите внимание, что getBestDateTimePattern () возвращает "наилучшую локализованную форму данного скелета для данной локали"
вы использовали какой-то ошибки типа. Если вы хотите установить 08/16/2011 на следующей схеме. Это неправильно, потому что
мм расшифровывается как минут используйте мм как это месяцев
DD is неправильно, должно быть dd представляет дней
попробуйте это, чтобы получить результат, который вы хотите получить (Tue Aug 16 "Whatever Time" IST 2011
),
String date = "08/16/2011"; //input date as String
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MM/dd/yyyy"); // date pattern
Date myDate = simpleDateFormat.parse(date); // returns date object
System.out.println(myDate); //outputs: Tue Aug 16 00:00:00 IST 2011