Ошибки в коде для построения строки даты

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 во втором шаблоне форматирования.

Другие вопросы по тегам