如何在单个方法中返回int日期,月份,年份

时间:2014-07-16 18:49:40

标签: java class object methods

我写了一个java程序,它将返回日期,月份和年份 (datatype 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;
      }

  }

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

10 个答案:

答案 0 :(得分:3)

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

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一次,然后从多个位置访问其属性。

答案 1 :(得分:1)

为每个

创建不同的方法
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);
}

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

使用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;
}

答案 5 :(得分:1)

标准格式的字符串ISO 8601

如果要将日期信息作为文本返回,请使用{8}库或Java 8中的新java.time包,使用{{定义的格式将日期时间值转换为字符串。 3}}。

这两个库默认使用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。作为奖励,接收对象将拥有其他信息,例如时区。

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

避免使用java.Util.Date.Calendar

java.util.Date和.Calendar类非常麻烦。避免他们。使用Joda-Time作为替代品非常普遍。 Java 8中的新java.time包是另一个替代品,受到了Joda-Time的启发。

LocalDate Class

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

答案 6 :(得分:1)

我想我可能会看到你想说的话。 '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 GregorianCalendar库中存在的import之类的内容,所以当我测试代码时,我最初感到困惑了几秒钟。

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

之后我制作了几个访问者 - getDay()getMonth()getYear() - 以防您需要抓住日期的具体方面。

为了完成它,我制作了一个toString()方法,以常规格式打印出DateTime个月String日{/ 1}}。

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

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

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

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);
    }
}

希望这有帮助! ; d

答案 7 :(得分:0)

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

如果只使用 int ,则可以将数据与位操作合并。

year | (month << 16) | (day << 24)

不知道它是否有效。

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

这在母语中更为常见。

答案 8 :(得分:0)

它类似于Calendar类已经拥有了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);
}

答案 9 :(得分:0)

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