Ошибки в коде для построения строки даты
package pass;
import java.lang.*;
public class Date{
private Mois mois;
public String date(String d){
int year=Integer.parseInt(d.substring(0,4));
int mount=Integer.parseInt(d.substring(5,7));
int day=Integer.parseInt(d.substring(8));
moi = Mois(mount);
String mois=moi.toString();
return ""+mois+" "+day+", "+year;
}
public enum Mois{
January(1),
February(2),
March(3),
April(4),
May(5),
June(6),
July(7),
August(8),
September(9),
October(10),
November(11),
December(12);
private int mois;
public Mois(int k){
this.mois=k;
}
public String toString(){
return this.toString();
}
}
}
Мне нужен Java-код возврата строки даты
Я не могу использовать формат даты, только строка
input "2017-01-15" Строка должна возвращаться "15 января 2017 г." String?
2 ответа
Вам нужно использовать SimpleDateFormat и указать в нем формат.
Конверсия по сегодняшней дате:
Format formatter = new SimpleDateFormat("MMMM dd, yyyy");
String s = formatter.format(new Date());
System.out.println(s);
Выход
February 22, 2017
Конвертация из строковой даты:
String date="2017-01-15";
DateFormat formatter1 = new SimpleDateFormat("yyyy-MM-dd");
Format formatter2 = new SimpleDateFormat("MMMM dd, yyyy");
String t = formatter2.format(formatter1.parse(date));
System.out.println(t);
Выход
January 15, 2017
Форматирование с использованием Java 8
String date="2017-01-15";
DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate ldate = LocalDate.parse(date, formatter1);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM dd, yy");
String s = ldate.format(formatter);
System.out.println(s);
Как вы уже догадались, ваша проблема в том, чтобы попытаться создать enum
постоянная вне перечисления через Mois(mount)
, enum
гарантирует, что в вашей JVM всегда есть ровно 1 экземпляр каждой константы, поэтому вы не можете этого сделать.
К счастью, в вашем случае есть простой способ обойти это. Ваши месяцы пронумерованы от 1 до 12. В то же время все константы в enum
уже пронумерованы, только от 0 (в данном случае через 11). Так чтобы получить Mois
число mount
, просто делать:
Mois moi = Mois.values()[mount - 1];
values()
возвращает массив, содержащий все константы. Я вычитаю 1 из mount
преобразовать из вашей нумерации на основе 1 в Java на основе 0.
В вашем коде также есть несколько мелких проблем. Лучше исправить их, чтобы заставить вещь работать:
- Вы не можете сделать
public Mois(int k)
вenum
; Ваша IDE, вероятно, уже сказала вам.enum
Конструктор должен быть закрытым. Я понимаю почему ты пыталсяpublic
, но с исправлением выше нам это больше не нужно, мы можем просто объявить этоprivate
, - Ваш
toString
Метод вызывает себя рекурсивно, приводя к бесконечной рекурсии. Просто удалите метод.enum
по умолчаниюtoString
методы, которые делают, как вы ожидаете. - У вас есть два объявления переменной с именем
mois
, Просто удалите переменную экземпляраprivate Mois mois;
, Опять же, с вышеуказанным исправлением вам это не нужно.
Теперь, когда я звоню date("2017-01-15")
, Я получил January 15, 2017
,
Я понимаю, что вам не разрешено использовать стандартные классы, поэтому я полагаю, что выше ответ на ваш вопрос. Для любого другого, в реальном мире , возможно, захочется использовать стандартные классы Java для манипуляции датами. Начиная с Java 8, нужно сделать что-то вроде:
String output = LocalDate.parse(inputDateString, DateTimeFormatter.ofPattern("uuuu-MM-dd", Locale.ROOT))
.format(DateTimeFormatter.ofPattern("MMMM d, yyyy", Locale.ROOT));
Выберите подходящую локаль (или пропустите два аргумента локали, чтобы использовать значение по умолчанию компьютера). Если вы хотите, чтобы день месяца имел префикс ноль для дней с 1 по 9 (01
через 09
), вы бы использовали dd
во втором шаблоне форматирования.