在JAVA中应用公历

在JAVA中应用公历,java,datetime,gregorian-calendar,java-calendar,Java,Datetime,Gregorian Calendar,Java Calendar,然而,它总是显示相同的时间。我做错了什么 另外,它不打算直接使用像gettime()这样的命令。字符串应该保留在那里。使用年、月。。。依此类推,这里您访问的是从GregorianCalendar类继承的静态字段。 但是,您必须使用以下变量访问日历字段: import java.util.GregorianCalendar ; public class MyCalendar extends GregorianCalendar { public static void main(String[

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


另外,它不打算直接使用像gettime()这样的命令。字符串应该保留在那里。

使用年、月。。。依此类推,这里您访问的是从GregorianCalendar类继承的静态字段。 但是,您必须使用以下变量访问日历字段:

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

通过使用年、月。。。依此类推,这里您访问的是从GregorianCalendar类继承的静态字段。 但是,您必须使用以下变量访问日历字段:

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

你的标题是“应用
gregoriacalendar
”,而这不是我在这个答案中所做的。虽然这是正确的,但我想向您展示如何最好地解决您的任务,第一点是我建议您不要使用早已过时的
gregorianalendar
类。今天我们的生活好多了。根据您的需要,您可以使用
LocalDateTime

     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;
}
该程序打印的内容类似于

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");
在代码中,我使用
ZoneId.systemDefault()
获取JVM的时区设置。这是易碎品,可能会在你背后更改,恕不另行通知。如果可以,请选择区域/城市格式的特定时区,例如:

2017-11-15-12-03-01
尽管名称
getCurrentTime()
为您提供了创建
MyCalendar
对象的时间,而不是调用该方法的时间。如果您喜欢后者,只需在方法中创建一个新的
LocalDateTime
对象


您可能更喜欢使用
ZonedDateTime
OffsetDateTime
而不是
LocalDateTime
,因为它们分别包括时区和UTC的偏移量。即使你看不到这些信息有什么直接的用途,也常常认为把它们扔掉是不好的做法。

你的标题是“应用
gregorianalendar
”,这不是我在这个答案中所做的。虽然这是正确的,但我想向您展示如何最好地解决您的任务,第一点是我建议您不要使用早已过时的
gregorianalendar
类。今天我们的生活好多了。根据您的需要,您可以使用
LocalDateTime

     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;
}
该程序打印的内容类似于

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");
在代码中,我使用
ZoneId.systemDefault()
获取JVM的时区设置。这是易碎品,可能会在你背后更改,恕不另行通知。如果可以,请选择区域/城市格式的特定时区,例如:

2017-11-15-12-03-01
尽管名称
getCurrentTime()
为您提供了创建
MyCalendar
对象的时间,而不是调用该方法的时间。如果您喜欢后者,只需在方法中创建一个新的
LocalDateTime
对象


您可能更喜欢使用
ZonedDateTime
OffsetDateTime
而不是
LocalDateTime
,因为它们分别包括时区和UTC的偏移量。即使你看不到这些信息有什么直接的用途,也常常认为把它们扔掉是不好的做法。

我知道这一事实。我的意思是,我不能使用像gettime()这样的方法直接得到答案。我需要使用string方法来获取字符串。然后打印出string@YuiHongNg我编辑了答案,可能会有帮助。我理解。谢谢你的帮助我想你的意思是“一天中的一小时”,而不是“一小时”?我知道这个问题已经存在了。@OleV.V。你说得对,谢谢你指出这个事实!我知道这个事实。我的意思是,我不能使用像gettime()这样的方法直接得到答案。我需要使用string方法来获取字符串。然后打印出string@YuiHongNg我编辑了答案,可能会有帮助。我理解。谢谢你的帮助我想你的意思是“一天中的一小时”,而不是“一小时”?我知道这个问题已经存在了。@OleV.V。你说得对,谢谢你指出这个事实!这确实不是一个强有力的继承理由。首选。为什么您仍然使用早已过时的
gregoriacalendar
类?现代的ZoneDateTime使用起来更方便,首先,它不可能产生像您所问的那样的bug。它的可能复制实际上不是继承的有力理由。首选。为什么您仍然使用早已过时的
gregoriacalendar
类?现代的ZoneDateTime使用起来更方便,首先,它不可能产生像您问题中那样的错误。可能是