【问题标题】:How can I return int date,month, year in a single method如何以单一方法返回 int 日期、月份、年份
【发布时间】:2014-09-07 10:23:46
【问题描述】:

我写了一个java程序,它会返回日期、月份和年份 (数据类型 int)

    import java.util.*;
    class DateTime {


    int day,month,year;


    GregorianCalendar date = new GregorianCalendar();

    public DateTime () {

      public  int TimeT() {


            day = date.get(Calendar.DAY_OF_MONTH);
            month = date.get(Calendar.MONTH);
            year = date.get(Calendar.YEAR);
                   // return day;
      }

  }

我真的很困惑如何返回日、月和年。 我必须退回它,所以我可以多次使用它。

【问题讨论】:

  • C++ 和这个有什么关系?
  • 将其作为int类型的数组返回
  • 将其转换为字符串...?
  • 创建一个类,或者使用 Joda Time。
  • 低级:结果 = 年 * 10000 + 月 * 100 + 天(在计算天数差异时几乎无用)

标签: java class object methods


【解决方案1】:

定义一个类型来封装这三个属性,并将方法返回类型更改为该类,如下所示:

public class YearMonthDay {
    private final year;
    private final month;
    private final day;
    public int getYear() {return year;}
    public int getMonth() {return month;}
    public int getDay() {return day;}
    public YearMonthDay(int y, int m, int d) {
        year = y;
        month = m;
        day = d;
    }
    // Consider overriding toString, and optionally hashCode and equals
}

现在您可以更改您的班级以返回YearMonthDay

public YearMonthDay TimeT(){
    return new YearMonthDay(
        date.get(Calendar.YEAR)
    ,   date.get(Calendar.MONTH)
    ,   date.get(Calendar.DAY_OF_MONTH)
    );
}

调用者现在可以一次获取YearMonthDay,然后从多个位置访问其属性。

【讨论】:

  • 也许也覆盖toString() in YearMonthDay
【解决方案2】:

我想我可能明白你想说什么。 “Braj”在他提供的代码中具有正确的想法。但是,我不确定这是否完全满足您的需求。我不确定您是要单独返回每个值(日、月、年),还是使用一种方法一起返回?无论如何,我都会尽力而为。

下面我将向您展示 DateTime 的代码:

import java.util.GregorianCalendar;

class DateTime {
    private int day, month, year;
    GregorianCalendar date = new GregorianCalendar();

    public DateTime() {
        day = date.get(GregorianCalendar.DAY_OF_MONTH);
        month = date.get(GregorianCalendar.MONTH) + 1;
        year = date.get(GregorianCalendar.YEAR);
    }
    public DateTime(int day, int month, int year){
        this.day = day;
        this.month = month;
        this.year = year;
    }

    // Accessors ///
    public int getDay(){
        return day;
    }
    public int getMonth(){
        return month;
    }
    public int getYear(){
        return year;
    }

    // Mutators ///
    public int setDay(){
        return day;
    }
    public int setMonth(){
        return month;
    }
    public int setYear(){
        return year;
    }

    // String ///
    public String toString(){
        return getMonth() + "/" + getDay() + "/" + getYear();
    }
}

现在解释一下。

我以 private 开头的日期、月份和年份,并保持默认构造函数几乎相同,除了一件事。

我在月份中添加了 1,因为 1 月至 12 月月份的索引为 0 - 11 而不是 1 - 12。这意味着您的月份不会遵循常规方法。我从来不知道java的import库中存在GregorianCalendar之类的东西,所以当我测试我的代码时,我最初困惑了几秒钟。

继续我制作了一个额外的构造函数,以防您出于任何原因想要输入自己的日期。如果您不打算制作单独的 DateTime 对象来保存随机日期,那么这完全没有必要。

之后我做了几个访问器——getDay()getMonth()getYear()——以防你需要获取日期的特定方面。

为了完成它,我创建了一个 toString() 方法,以传统格式在一个 String 中打印出您的 DateTime 的日期和月份。

如果您不想更改日期的各个方面(例如日、月或年),我建议您去掉“Mutators”。如果您不想访问日期的各个方面,那么我建议您去掉“访问器”。

现在,如果出于某种原因,您希望能够在 CLIENT 中编辑和访问日期的组件,那么您不应该创建 daymonthyear private 的实例,而是public

这是 DateTime 类的代码,它允许您更改 CLIENT 中的值。 (我不推荐这个。我建议你习惯于制作访问器和修改器。)我决定称之为DateTime2

import java.util.GregorianCalendar;

class DateTime2 {
    public int day, month, year;
    GregorianCalendar date = new GregorianCalendar();

    public DateTime2() {
        day = date.get(GregorianCalendar.DAY_OF_MONTH);
        month = date.get(GregorianCalendar.MONTH) + 1;
        year = date.get(GregorianCalendar.YEAR);
    }
    public DateTime2(int day, int month, int year){
        this.day = day;
        this.month = month;
        this.year = year;
    }
    public String toString(){
        return month + "/" + day + "/" + year;
    }
}

我把第二个构造函数留在那里,以防你仍然想用不同的日期创建单独的 DateTime2 对象......

这里如果测试这两个类的客户端代码出来,后面跟着输出:

客户:

public class DateTime_CLIENT{
    public static void main(){
        DateTime dt = new DateTime();

        System.out.println("- DateTime -");
        System.out.println("Date: " + dt);
        System.out.println("Month: " + dt.getMonth());
        System.out.println("Day: " + dt.getDay());
        System.out.println("Year: " + dt.getYear() + "\n");

        DateTime2 dt2 = new DateTime2();

        System.out.println("- DateTime2 -");
        System.out.println("Date: " + dt2);
        System.out.println("Month: " + dt2.month);
        System.out.println("Day: " + dt2.day);
        System.out.println("Year: " + dt2.year + "\n");

        dt2.day = 400000;

        System.out.println("- DateTime2 - CHANGE FROM CLIENT");
        System.out.println("Date: " + dt2);
        System.out.println("Month: " + dt2.month);
        System.out.println("Day: " + dt2.day);
        System.out.print("Year: " + dt2.year);
    }
}

输出:

- DateTime -
Date: 7/16/2014
Month: 7
Day: 16
Year: 2014

- DateTime2 -
Date: 7/16/2014
Month: 7
Day: 16
Year: 2014

- DateTime2 - CHANGE FROM CLIENT
Date: 7/400000/2014
Month: 7
Day: 400000
Year: 2014

希望这有帮助! ;D

【讨论】:

  • 你真的很有帮助。返回“”+月+“/”+日+“/”+年;这正是我所需要的。
  • 啊,我感觉这就是你要找的东西 >u
  • 哦,是的!将来如果您发布代码,实际上真的很容易。您可以在类中复制粘贴,然后选择它并单击 ctrl + k。现在看起来很正常,但是当我复制并粘贴它以仔细查看之前,我很困惑xD
【解决方案3】:

为每一个创建不同的方法

public int getDay(Date date){
     return date.get(Calendar.DAY_OF_MONTH);
}

public int getMonth(Date date){
     return date.get(Calendar.MONTH);
}


public int getYear(Date date){
     return date.get(Calendar.YEAR);
}

【讨论】:

    【解决方案4】:

    从三个字段中创建一个类并返回该类型的对象。

    【讨论】:

      【解决方案5】:

      Java 实际上不能用一个方法返回多个值。但是,您可以让您的方法返回一个包含必要信息的字符串,然后解析该字符串。或者,创建一个包含所有必要属性的 daymonthyear 对象并返回该对象。

      【讨论】:

        【解决方案6】:

        使用HashMap

        public HashMap<String, Integer> TimeT() {
            HashMap<String, Integer> dateMap = new HashMap<String, Integer>();
            dateMap.put("day",date.get(Calendar.DAY_OF_MONTH));
            dateMap.put("month",date.get(Calendar.MONTH));
            dateMap.put("year",date.get(Calendar.YEAR));
        
            return dateMap;
        }
        

        【讨论】:

          【解决方案7】:

          标准格式的字符串,ISO 8601

          如果您想以文本形式返回日期信息,请使用 Joda-Time 库或 Java 8 中的新 java.time 包将日期时间值转换为使用 ISO 8601 standard 定义的格式的字符串。

          这两个库默认使用 ISO 8601 格式。如2014-07-13T18:02:49+05:30

          String output = DateTime.now().toString(); // YYYY-MM-DDTHH:MM:SS.SSS+-00:00:00 format.
          

          但最好指定所需的时区,而不是隐式依赖 JVM 的默认时区。

          DateTimeZone timeZone = DateTimeZone.forID( "America/Montreal" );
          String output = DateTime.now( timeZone ).toString(); 
          

          如果您只需要年、月和日期,则使用备用格式化程序而不是默认格式化程序。下面的代码产生一个类似2014-07-13的字符串。

          DateTimeZone timeZone = DateTimeZone.forID( "America/Montreal" );
          DateTime now = DateTime.now( timeZone );
          DateTimeFormatter formatter = ISODateTimeFormat.date(); // YYYY-MM-DD formatter.
          String output = formatter.print( now );
          

          传递DateTime对象

          如果您希望将数字值而不是字符串传递给另一个对象,则只需传递 Joda-Time DateTime 对象。接收对象可以调用 DateTime 上的方法,例如 getYeargetMonthOfYeargetDayOfMonth。作为奖励,接收对象将拥有额外的信息,例如时区。

          其他答案对于一般情况是正确的:创建一个类或使用一个集合来传递多个值,因为 Java 只能从一个方法返回一个项目。但是在日期时间值的特定情况下,当我们已经有这样的类可供我们使用时,发明一个类似乎很愚蠢。

          避免使用java.Util.Date.Calendar

          java.util.Date 和 .Calendar 类是出了名的麻烦。避开他们。使用 Joda-Time 作为替代品是很常见的。 Java 8 中新的 java.time 包是另一个替代品,它的灵感来自 Joda-Time。

          LocalDate 类

          Joda-Time 和 java.time 都提供了一个 LocalDate 类来表示没有时间和时区的仅日期。你可能想使用这个类。通常,如果跨时区进行任何比较,日期时间会更好,因为一天的开始和结束由时区定义。

          【讨论】:

            【解决方案8】:

            最好的情况是创建一个包含年、月和日成员的类,在返回的方法中初始化。

            如果只有和 int 必须使用,您可以将数据与位操作合并。

            year | (month &lt;&lt; 16) | (day &lt;&lt; 24)

            不知道它是否是有效的java。

            阅读将是:
            year = date &amp; 0xffff;
            month = (date &gt;&gt; 16) &amp; 0xff;
            day = (date &gt;&gt; 24) &amp; 0xff;

            这在母语中更为常见。

            【讨论】:

              【解决方案9】:

              看起来日历类已经具备了 OP 所需的一切。无需将返回的值放入哈希图或数组或其他任何东西中。在 OP 代码中,没有 return 语句,但他希望能够重用代码。下面是一个简单的方法,它演示了 Calendar 类为我们提供了什么。任何返回 Calendar 对象的方法都会为我们提供所需的一切,因为我们可以使用 get 提取所需的值。

              public static void main(String[] args) {
                 int day,month,year;
                 GregorianCalendar date = new GregorianCalendar();
                 day = date.get(Calendar.DAY_OF_MONTH);
                 month = date.get(Calendar.MONTH);
                 year = date.get(Calendar.YEAR);
                 System.out.println("Day:" + day);
                 System.out.println("month:" + month);
                 System.out.println("year:" + year);
              }
              

              【讨论】:

                【解决方案10】:

                保持简单。返回Date 对象(它包含您需要的所有内容)或与此日期相对应的 ISO 字符串,以便以后重建它。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2021-12-16
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-02-18
                  • 1970-01-01
                  相关资源
                  最近更新 更多