簡體   English   中英

是否可以直接從“日歷”字段獲取時差?

[英]Is it possible to get time difference from directly Calendar fields?

如果標題令人困惑,對不起。 讓我清楚地解釋一下。 我需要玩幾天,幾個月和幾年。 為此,我使用日歷。 這是我的代碼;

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)是否可以做它只是將相應的日歷字段(日期,月,年)轉換為秒或毫秒,然后從(1 11 2018)中減去(1 5 2018)的毫秒值,然后將毫秒轉換回天? 有類似的問題,但我無法完全按照自己的方式找到解決方案。

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天的時間太少,或者在極少數情況下會導致1天的時間太多。

問題:我可以在Android上使用java.time嗎?

是的, java.time在Android設備上運行良好。 它至少需要Java 6

  • 在Java 8和更高版本中以及在新的Android設備上(有人告訴我API級別為26),新的API是內置的。
  • 在Java 6和7中,獲取ThreeTen Backport,即新類的backport(用於JSR 310的ThreeTen,首次描述了現代API)。
  • 在(較舊的)Android上,使用Android版本的ThreeTen Backport。 它稱為ThreeTenABP。 確保從包org.threeten.bp和子包中導入日期和時間類。

鏈接

您可以嘗試類似的方法為您工作

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

    } 
} 

您可以執行此操作。 更改年份,月份和日期並在日歷中進行設置。 使用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()));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM