Как напечатать дату в формате дд / мм в Java - PullRequest
0 голосов
/ 16 марта 2019

Я хочу написать класс, чтобы можно было печатать дату в формате dd/mm, но я не знаю, с чего начать.

Вот часть main()

Код:

import java.util.Arrays;

public class SortMonthDate {

    public static void main(String[] args) {
        MonthDate[] mdates = new MonthDate[5];
        mdates[0] = new MonthDate(22, 7);
        mdates[1] = new MonthDate(25, 8);
        mdates[2] = new MonthDate(25, 6);
        mdates[3] = new MonthDate(28, 9);
        mdates[4] = new MonthDate(5, 9);
        print(mdates);
        Arrays.sort(mdates);
        print(mdates);
    }

    static <T> void print(T[] a) {
        for (T t : a) {
            System.out.printf("%s ", t);
        }
        System.out.println();
    }
}

Ответы [ 3 ]

3 голосов
/ 17 марта 2019

Для этого есть класс!

java.time.MonthDay

Вместо того, чтобы бросать свои собственные, используйте класс MonthDay, встроенный в Java 8 и более поздние версии. Для Java 6 и 7 используйте задний порт.

MonthDay[] mds = new MonthDay[5] ;
mds[0] = MonthDay.of( 7 , 22 ) ;
mds[1] = MonthDay.of( Month.AUGUST , 25 ) ;
mds[2] = MonthDay.of( Month.JUNE , 25 ) ;
mds[3] = MonthDay.of( Month.SEPTEMBER , 28 );
mds[4] = MonthDay.of( 9 , 5 ) ;
Arrays.sort(mdates);

Лучше использовать Коллекции Java в целом.

List< MonthDay > mds = new ArrayList<>() ;
mds.add( MonthDay.of( 7 , 22 ) ) ;
mds.add( MonthDay.of( Month.AUGUST , 25 ) ) ;
mds.add( MonthDay.of( Month.JUNE , 25 ) ) ;
mds.add( MonthDay.of( Month.SEPTEMBER , 28 ) ) ;
mds.add( MonthDay.of( 9 , 5 ) ) ;
Collections.sort( mds ) ;

Строка

Я хочу написать класс, чтобы я мог напечатать дату в формате дд / мм,

Чтобы узнать о написании класса, ознакомьтесь с исходным кодом в проекте OpenJDK .

Что касается генерации текста, представляющего этот класс дня месяца, просто вызовите toString, чтобы сгенерировать значение в стандартном формате ISO 8601 . Я настоятельно рекомендую использовать эти стандартные форматы для регистрации, хранения и обмена значениями даты и времени в виде текста.

MonthDay.of( Month.JUNE , 25 ) )
        .toString()

- 06-25

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

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM" ) ;
String output = mds.get( 0 ).format( f ) ;  // Generate string in custom format.

25/06

Дамп на консоль.

System.out.println( "mds: " + mds ) ;
System.out.println( "mds.get( 0 ) = " +  mds.get( 0 ) + "  |  output: " + output ) ;

См. Этот код, запущенный в режиме реального времени на IdeOne.com .

mds: [--06-25, --07-22, --08-25, --09-05, --09-28]

mds.get (0) = --06-25 | выход: 25/06


О java.time

Фреймворк java.time встроен в Java 8 и более поздние версии. Эти классы заменяют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .

Вы можете обмениваться java.time объектами напрямую с вашей базой данных. Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где получить классы java.time?

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и еще .

1 голос
/ 16 марта 2019

Если вы печатаете объект в System.out Java использует метод Object.toString () для получения строкового представления вашего объекта. Таким образом, вы можете перезаписать метод toString() по умолчанию, внедрив его в класс MonthDate.

Для форматирования значений int вы можете использовать метод String.format () . Формат %02d дополняет значение 0, если оно меньше 10. Чтобы получить формат dd/mm, вы можете использовать %02d/%02d.

С учетом сказанного ваш toString() метод может выглядеть следующим образом:

@Override
public String toString() {
    return String.format("%02d/%02d", this.day, this.month);
}

Используя new MonthDate(12, 3), вы получите:

12/03

Вместо:

MonthDate@42af3438
0 голосов
/ 16 марта 2019

Предполагая, что ваши MonthDate атрибуты класса

private int day;
private int month;

Вы всегда должны реализовывать метод toString() для каждого класса в Java, потому что вы будете представлять каждый объект по-разному.

Что касается сортировки ваших объектов по дате, вы не можете использовать Arrays.sort(), потому что вы не сортируете числа. Вы должны реализовать свой собственный метод сортировки. Вот один, который я рекомендую вам:

public static void sort(MonthDate[] s) {
    int[] days = new int[s.length];
    int[] months = new int[s.length];

    for (int i = 0; i < s.length; i++) {
        days[i] = s[i].day;
        months[i] = s[i].month;
    }

    Arrays.sort(days);
    Arrays.sort(months);

    for (int i = 0; i < s.length; i++) {
        s[i].day = days[i];
        s[i].month = months[i];
    }
}

Мы помещаем days и months в 2 разных массива и сортируем их, используя Arrays.sort(), затем присваиваем их обратно экземпляру объекта.

Вы также можете реализовать этот метод toString() и затем вызвать его в своем методе print(), поскольку вы не можете печатать объект напрямую с помощью System.out.println().

public String toString() {
    return "" + this.day + "/" + this.month;
}

В вашей функции print() вы должны использовать метод toString() следующим образом:

public static <T> void print(T[] a) {
    for (T t : a) {
        System.out.println(t.toString());
    }
    System.out.println();
}

Наконец, вы можете сохранить ваш main таким, и он будет отсортирован и правильно напечатан.

public static void main(String[] args) {
    MonthDate[] mdates = new MonthDate[5];
    mdates[0] = new SortMonthDate(22, 7);
    mdates[1] = new SortMonthDate(25, 8);
    mdates[2] = new SortMonthDate(25, 6);
    mdates[3] = new SortMonthDate(28, 9);
    mdates[4] = new SortMonthDate(5, 9);
    print(mdates);
    sort(mdates);
    print(mdates);
}

Вот полный код:

MonthDate класс

import java.util.Arrays;

public class MonthDate {

    private int day;
    private int month;

    public MonthDate(int day, int month) {
        this.day = day;
        this.month = month;
    }

    public static void sort(MonthDate[] s) {
        int[] days = new int[s.length];
        int[] months = new int[s.length];

        for (int i = 0; i < s.length; i++) {
            days[i] = s[i].day;
            months[i] = s[i].month;
        }

        Arrays.sort(days);
        Arrays.sort(months);

        for (int i = 0; i < s.length; i++) {
            s[i].day = days[i];
            s[i].month = months[i];
        }
    }

    public String toString() {
        return "" + this.day + "/" + this.month;
    }

    public static <T> void print(T[] a) {
        for (T t : a) {
            System.out.println(t.toString());
        }
        System.out.println();
    }

}

Класс SortMonthDate

public class SortMonthDate {

    public static void main(String[] args) {


            MonthDate[] mdates = new MonthDate[5];
            mdates[0] = new MonthDate(22, 7);
            mdates[1] = new MonthDate(25, 8);
            mdates[2] = new MonthDate(25, 6);
            mdates[3] = new MonthDate(28, 9);
            mdates[4] = new MonthDate(5, 9);
            MonthDate.print(mdates);
            MonthDate.sort(mdates);
            MonthDate.print(mdates);

    }

}

Обратите внимание, что вместо того, чтобы делать ваши MonthDate методы статичными, вы можете сделать их не статичными и вызывать их в main, используя, например, mdates.print();.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...