【问题标题】:Changing format from input default to Month D, YYYY将格式从输入默认更改为 Month D, YYYY
【发布时间】:2019-04-02 06:45:08
【问题描述】:

0

我正在为我的学校作业制作一个 Date 类,它基本上做了一些基本功能,就像 API Date 一样。不允许任何方法与 Java 的 API Date 类关联,除了设置为当前本地时间的构造函数之一。然后我做了一个方法来改变基于输入选项的格式。代码工作得很好,但是格式方法的月输出计算错误。也许我对数组的逻辑做错了,但不知道如何使它正确。 例如:如果我输入 4/2/2019 并选择选项 B,那么它会打印“December 2 2019”而不是“April”

我尝试了 month = 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;
    }
}

【问题讨论】:

标签: java date for-loop format date-formatting


【解决方案1】:

这是选项 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 月的 1 到 12 月的 12 编号,您没有得到完全正确的数组元素,但您很快就会发现,所以我让您自己来修复它。在任何情况下,您都需要做出明确的决定:在您的班级中,一月是 0 还是 1?

【讨论】:

    【解决方案2】:

    Answer by 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 类表示仅日期值,没有时间,也没有 time zoneoffset-from-UTC

    时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因区域而异。例如,Paris France 中午夜后几分钟是新的一天,而 Montréal Québec 中仍然是“昨天”。

    如果没有指定时区,JVM 会隐式应用其当前的默认时区。该默认值可能在运行时(!)期间change at any moment,因此您的结果可能会有所不同。最好将您想要/预期的时区明确指定为参数。如果关键,请与您的用户确认该区域。

    Continent/Region 的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用 2-4 个字母的缩写,例如 ESTIST,因为它们不是真正的时区,没有标准化,甚至不是唯一的 (!)。

    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 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

    要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

    Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

    您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。

    从哪里获得 java.time 类?

    ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多