是否可以直接从“日历”字段获取时差?

时间:2018-11-18 13:33:56

标签: java android calendar

对不起,如果标题令人困惑。让我清楚地解释一下。我需要玩几天,几个月和几年。为此,我使用日历。这是我的代码;

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        int dayStart=0,monthStart=0,yearStart=0,dayFinish=0,monthFinish=0,yearFinish=0;

            Calendar cal = (Calendar) Calendar.getInstance();

            cal.set(Calendar.MONTH,Calendar.MAY); //SET MONTH AS MAY
            cal.set(Calendar.DATE,1);
            cal.set(Calendar.YEAR,2018);

            monthStart=(cal.getCalendar.MONTH)+1);
            dayStart=cal.get(Calendar.DATE);
            yearStart=cal.get(Calendar.YEAR);

            System.out.println("STARTING DAY: "+dayStart+" STARTING MONTH: "+monthStart+" STARTING YEAR: "+yearStart);

            cal.add(Calendar.MONTH,6); //ADD 6 MONTHS

            monthFinish = (cal.get(Calendar.MONTH)+1);
            dayFinish = (cal.get(Calendar.DATE));
            yearFinish = (cal.get(Calendar.YEAR));

            System.out.println("FINISHING DAY: "+dayFinish+" FINISHNG MONTH: "+monthFinish+" FINISHING YEAR: "+yearFinish);
//WHAT I WANT IS printing out the days between 2 dates: 184
    }

首先,我将时间设置为:1 5 2018,然后我加上6个月,时间变为1 112018。我需要将日差设为184(如果我将月份设置为1月,则应为181)是吗仅将相应的Calendar字段(日期,月,年)转换为秒或毫秒,并从(1 11 2018)中减去(1 5 2018)的毫秒值,然后将毫秒转换回天,是否有可能?有类似的问题,但我无法完全按照自己的方式找到解决方案。

3 个答案:

答案 0 :(得分:2)

java.time

    LocalDate start = LocalDate.of(2018, Month.MAY, 1);
    LocalDate finish = start.plusMonths(6);
    long daysBetween = ChronoUnit.DAYS.between(start, finish);
    System.out.format("Days between %s and %s: %d%n", start, finish, daysBetween);

恕我直言,这很简单。和奖金,它可以正常工作。输出为:

  

2018-05-01至2018-11-01之间的天数:184

Calendar类存在设计问题,现在已经过时了。因此,我建议改为使用现代Java日期和时间API java.time。 有一种方法可以正确地对Calendar进行天数计数,但是它比您预期的要复杂得多,因此没有理由烦恼。从毫秒计算天数(这在Stack Overflow的几个答案中显示,不仅是这个问题的其他答案)有时会给出正确的结果,有时却不能。这两个问题是:(1)由于夏季时间(DST)和其他间断性,一天可能是23、24或25小时,或者介于此间隔之间甚至超出此间隔的某个数字。如果间隔中的一天少于24小时,那么从毫秒转换将导致1天太少。 (2)Calendar(尽管其名称)也保存一天中的时间。在您的代码中,它将在添加6个月前后的一天中的同一时间举行。在其他情况下,一天中的不同时间可能会导致您得到1天的时间过少,或者在极少数情况下,导致一天的时间过长。

问题:我可以在Android上使用java.time吗?

是的,java.time在Android设备上运行良好。它只需要至少 Java 6

  • 在Java 8和更高版本以及新的Android设备上(有人告诉我API级别为26),新的API是内置的。
  • 在Java 6和7中,获得了ThreeTen反向端口,即新类的反向端口(JSR 310的ThreeTen,首次描述了现代API)。
  • 在(较旧的)Android上,使用ThreeTen Backport的Android版本。叫做ThreeTenABP。确保从包org.threeten.bp和子包中导入日期和时间类。

链接

答案 1 :(得分:1)

您可以尝试类似的操作

import java.util.*; 
import java.util.concurrent.TimeUnit;
public class Calendar1 { 
    public static void main(String args[]) 
    { 
        Calendar startDate = Calendar.getInstance(); 
        //Setting year, month and day
        startDate.set(2018, 5, 1);
        Calendar endDate = Calendar.getInstance(); 
        endDate.set(2018, 11, 1);
        long end = endDate.getTimeInMillis();
        long start = startDate.getTimeInMillis();
        System.out.println("Time difference in days " + TimeUnit.MILLISECONDS.toDays(Math.abs(end - start)));

    } 
} 

答案 2 :(得分:1)

您可以执行此操作。更改年份,月份和日期并在日历中进行设置。 使用java.time.temporal.ChronoUnit获得差异。 示例代码如下。

公共无效daysBetween(){

    Calendar startOfMonth = Calendar.getInstance();
    startOfMonth.set(Calendar.YEAR, 2018);
    startOfMonth.set(Calendar.MONTH, 10);
    startOfMonth.set(Calendar.DAY_OF_MONTH, 1);

    Calendar endOfMonth = Calendar.getInstance();
    endOfMonth.set(Calendar.YEAR, 2018);
    endOfMonth.set(Calendar.MONTH, 10);
    endOfMonth.set(Calendar.DAY_OF_MONTH, 30);

    System.out.println(ChronoUnit.DAYS.between(startOfMonth.toInstant(),endOfMonth.toInstant()));
}