在JAVA中应用公历

时间:2017-11-15 09:42:37

标签: java datetime gregorian-calendar java-calendar

import  java.util.GregorianCalendar ;
public class MyCalendar extends  GregorianCalendar  {
public static void main(String[] args) {
           MyCalendar a = new MyCalendar();
           System.out.println(a.getCurrenttime());
}

public String getCurrenttime(){
     String time= YEAR+"-"+(MONTH+1)+"-"+DATE+"-"+HOUR+"-"+MINUTE+"-"+SECOND; 
     return time;}}

然而,它总是显示同一时间。我做错了什么。

P.S。它不打算直接使用像gettime()这样的命令。字符串应保留在那里。

2 个答案:

答案 0 :(得分:0)

使用YEAR,MONTH ......等等,在这里您将访问从GregorianCalendar类继承的静态字段。 但是,您必须使用这些变量访问日历的字段,如下所示:

     public String getCurrenttime(){

    String time= this.get(YEAR)+"-"+(this.get(MONTH)+1)+"-"+
            this.get(DATE)+"-"+this.get(HOUR_OF_DAY)+"-"+this.get(MINUTE)+"-"+this.get(SECOND);
    return time;
}

答案 1 :(得分:0)

你的标题是“申请GregorianCalendar”,而这不是我在这个答案中所做的。虽然mustabelMo’s answer是正确的,但我想向您展示如何最好地解决您的任务问题,第一点是我建议您不要使用长期过时的GregorianCalendar类。今天我们在the modern Java date and time API known as java.time or JSR-310中做得更好。根据您的需要,您可以使用LocalDateTime

import java.time.ZoneId;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class MyCalendar {

    public static void main(String[] args) {
        MyCalendar a = new MyCalendar();
        System.out.println(a.getCurrentTime());
    }

    private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("u-M-d-H-m-s");
    private LocalDateTime now = LocalDateTime.now(ZoneId.systemDefault());

    private String getCurrentTime() {
        return now.format(formatter);
    }

}

该程序打印类似

的内容
2017-11-15-11-59-1

其他注意事项:

首选组合而不是继承。不是从用于获取日历数据的任何类继承,而是将类的对象封装在类中更好的样式。

使用格式化程序将日期时间格式化为字符串,如果您想要不同的格式,则更方便,更容易更改。例如,许多人希望总是以两位数打印分钟和秒,必要时前导零。要获得这个,只需使用两种格式的模式字母而不是一种:

    private static final DateTimeFormatter formatter
            = DateTimeFormatter.ofPattern("u-M-d-H-mm-ss");

现在输出就像

2017-11-15-12-03-01

在代码中我使用ZoneId.systemDefault()来获取JVM的时区设置。这很脆弱,可能会在您背后更改,恕不另行通知。如果可以,请选择 region / city 格式的特定时区,例如:

private LocalDateTime now = LocalDateTime.now(ZoneId.of("Asia/Hong_Kong"));

尽管名称getCurrentTime()为您提供了创建MyCalendar对象的时间,但不是调用方法的时间。如果您更喜欢后者,只需在方法中创建一个新的LocalDateTime对象。

您可能更喜欢使用ZonedDateTimeOffsetDateTime而不是LocalDateTime,因为它们分别包含时区和与UTC的偏移。即使您没有立即使用此信息,也常常将这些信息丢弃。