【问题标题】:applying Gregorian Calendar in JAVA [closed]在 JAVA 中应用公历[关闭]
【发布时间】:2018-04-28 11:23:44
【问题描述】:
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;}}

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

附:它旨在不直接使用 gettime() 之类的命令。字符串应该保留在那里。

【问题讨论】:

标签: java datetime gregorian-calendar java-calendar


【解决方案1】:

你的标题是“申请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 对象即可。

您可能更喜欢使用ZonedDateTime 或OffsetDateTime 而不是LocalDateTime,因为它们分别包含时区和与UTC 的偏移量。即使您看不到这些信息有任何直接用途,也通常认为将其丢弃是一种不好的做法。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我知道这个事实。我的意思是我不能使用像 gettime() 这样的方法直接得到答案。我需要使用字符串方法来获取字符串。然后打印出字符串
    • @YuiHongNg 我编辑了答案,它可能会有所帮助。
    • 我明白了。感谢您的帮助
    • 我怀疑你的意思是this.get(HOUR_OF_DAY),而不是this.get(HOUR)?我知道问题已经存在。
    • @OleV.V.你是对的,谢谢你指出这个事实!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多