Изменение формата ввода по умолчанию на Месяц D, ГГГГ - PullRequest
0 голосов
/ 02 апреля 2019

0

Я делаю урок по дате для своей школьной работы, который в основном выполняет некоторые базовые функции, такие как API Date.Ни одному из методов не разрешается связываться с классом API даты Java, кроме одного из конструкторов, которые устанавливают текущее местное время.Затем я сделал метод для изменения формата на основе параметра ввода.Код работает довольно хорошо, однако в методе форматирования просчитан вывод за месяц.Возможно, я неправильно выполнил логику массива, но не смог понять, как это сделать правильно.Например: если я помещу 4/4/2019 и выберу опцию B, тогда будет напечатано «2 декабря 2019 года» вместо «апреля»

Я пробовал месяц = ​​0 и 1 для цикла, который не работает.

import java.util.*;
public class Date
{
    // declare needed variables
   private int day;
   private int month;
   private int year;

   /**
    * Default constructor to set the date info to the current date 
    */
   public Date()
   {
       // I have trouble assign Date using the Java API Date class
       Date d1 = new Date();
       Calendar cal = Calendar.getInstance();
       cal.setTime(d1);
       day= cal.get(Calendar.DAY_OF_MONTH);
       month = cal.get(Calendar.MONTH);
       year = cal.get(Calendar.YEAR);
    }
    /**
    * Overloaded constructor to set the date info based on user input
    * @param int inMonth to input month value
    * @param int inDay to input day value
    * @param int inYear to input year value
    *
    */
    public Date( int inMonth, int inDay, int inYear)
    {
       //set all the inputs into suitable variables
       day = inDay;
       month = inMonth;
       year = inYear;
    }
    public String getDate(char format)
    {
        //String Array for option B

        String[] mArray = {"January","Febuary","March","April","May","June","July","August","September","October","November","December"};
        String dayString = new String();
        //Switch code with param input format option and return the String based on it
        switch(format)
        {
            case 'A':
                dayString = month+"/"+day+"/"+year;
            break;
            case 'B':
            for(month = 1;month<mArray.length;month++)
            {

                dayString = mArray[month]+" "+day+" "+year;
            }
            break;
        }
        return dayString;
    }
    /**
    * ToString method to return date info
    * @return String of Date
    */
     public String toString()
    {
        //Return value of Date in String
        return month+"/"+day+"/"+year;
    }
}

Ответы [ 2 ]

1 голос
/ 03 апреля 2019

Это код, который у вас есть для варианта B:

        for(month = 1;month<mArray.length;month++)
        {

            dayString = mArray[month]+" "+day+" "+year;
        }

Это повторяет месяцы с 1 по 11. Таким образом, первый раз в цикле присваивается February 2 2019, в следующий раз это значение перезаписывается на March 2 2019 и т. Д. После цикла последнее назначенное значение, December 2 2019, остается там.

Нет смысла использовать цикл. Основное решение вашей проблемы - оставить это:

        dayString = mArray[month] + " " + day + " " + year;

Предполагая, что ваши месяцы пронумерованы с 1 по январь до 12 за декабрь, вы не получаете точный правильный элемент массива, но вы узнаете достаточно скоро, поэтому я оставляю это на ваше усмотрение, чтобы исправить это. В любом случае вам нужно четкое решение: представлен ли январь в вашем классе как 0 или 1?

0 голосов
/ 04 апреля 2019

Ответ Ole V.V. выглядит хорошо для меня. Я добавлю пару мыслей: имя класса и java.time .

Наименование класса

Смешивание вашего собственного класса с именем Date с существующим классом Date вызывает проблемы. Используйте другое имя.

java.time

Заменить это:

   // I have trouble assign Date using the Java API Date class
   Date d1 = new Date();
   Calendar cal = Calendar.getInstance();
   cal.setTime(d1);
   day= cal.get(Calendar.DAY_OF_MONTH);
   month = cal.get(Calendar.MONTH);
   year = cal.get(Calendar.YEAR);

… с современными java.time классами.

Класс LocalDate представляет значение только для даты без времени суток и без часового пояса или смещения от UTC .

Часовой пояс имеет решающее значение при определении даты. В любой момент времени дата меняется по всему земному шару в зависимости от зоны. Например, через несколько минут после полуночи в Париж Франция - это новый день, а еще "вчера" в Монреаль Квебек .

Если часовой пояс не указан, JVM неявно применяет свой текущий часовой пояс по умолчанию. Это значение по умолчанию может измениться в любой момент во время выполнения (!), Поэтому ваши результаты могут отличаться. Лучше явно указать желаемый / ожидаемый часовой пояс в качестве аргумента. Если критично, подтвердите зону с вашим пользователем.

Укажите собственное имя часового пояса в формате Continent/Region, например America/Montreal, Africa/Casablanca или Pacific/Auckland. Никогда не используйте 2-4 буквенные сокращения, такие как EST или IST, так как они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).

ZoneId z = ZoneId.of( "America/Montreal" ) ;  
LocalDate today = LocalDate.now( z ) ;

Если вы хотите использовать текущий часовой пояс JVM по умолчанию, запросите его и передайте в качестве аргумента. Если опущен, код становится неоднозначным для чтения, поскольку мы точно не знаем, намеревались ли вы использовать значение по умолчанию или если вы, как и многие программисты, не знали об этой проблеме.

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.

Вернуться к вашему коду.

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;  // If crucial, confirm with the user.
LocalDate today = LocalDate.now( z ) ;
this.day = today.getDayOfMonth() ;
this.month = today.getMonthValue() ; // Sanely numbered 1-12 for January-December. Tip: better to use the `Month` enum objects rather than mere integer.
this.year = today.getYear() ;

О 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 и больше .

...