web-dev-qa-db-ja.com

2回の差を計算するandroid

私は開発中ですAndroidアプリ、2つの時間の差を計算する必要があります.24時間の時間差と2日間の時間の差も計算する必要があります(例:今日の午後5時から明日の午前9時まで)。

以下のコードを試して、24時間しか機能しない差を計算しました。

String dateStart = "08:00:00";
String dateStop = "13:00:00";

//HH converts hour in 24 hours format (0-23), day calculation
SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");

Date d1 = null;
Date d2 = null;

try 
{
    d1 = format.parse(dateStart);
    d2 = format.parse(dateStop);

    //in milliseconds
    long diff = d2.getTime() - d1.getTime();
    long diffHours = diff / (60 * 60 * 1000) % 24;
    Log.e("test",diffHours + " hours, ");
}
catch (Exception e) 
{
    // TODO: handle exception
} 
7
Dave

サー、Java機能を使用して簡単に作成できます。long difference = date2.getTime() - date1.getTime();これを見てください リンク これは役に立ちます。

13
Yup

適切な時差を見つける正しい方法:

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm");
Date startDate = simpleDateFormat.parse("22:00");
Date endDate = simpleDateFormat.parse("07:00");

long difference = endDate.getTime() - startDate.getTime(); 
if(difference<0)
{
    Date dateMax = simpleDateFormat.parse("24:00");
    Date dateMin = simpleDateFormat.parse("00:00");
    difference=(dateMax.getTime() -startDate.getTime() )+(endDate.getTime()-dateMin.getTime());
}
int days = (int) (difference / (1000*60*60*24));  
int hours = (int) ((difference - (1000*60*60*24*days)) / (1000*60*60)); 
int min = (int) (difference - (1000*60*60*24*days) - (1000*60*60*hours)) / (1000*60);
Log.i("log_tag","Hours: "+hours+", Mins: "+min); 

結果は次のようになります:時間:9、分:0

6
Kalpesh

tl; dr

ChronoUnit.HOURS.between( 
    LocalTime.parse( "08:00:00" ) , 
    LocalTime.parse( "13:00:00" ) 
)

5

…または…

ChronoUnit.HOURS.between( 
    ZonedDateTime.of( 
        LocalDate.of( 2017 , Month.JANUARY , 23 ) ,
        LocalTime.parse( "08:00:00" ) , 
        ZoneId.of( "America/Montreal" )
    ) , 
    ZonedDateTime.of( 
        LocalDate.of( 2017 , Month.JANUARY , 25 ) ,
        LocalTime.parse( "13:00:00" ) , 
        ZoneId.of( "America/Montreal" )
    ) 
) 

53

Java.time

最新のアプローチでは、Java.timeクラスを使用します。

LocalTime

LocalTime クラスは、日付とタイムゾーンのない時刻を表します。

LocalTime start = LocalTime.parse( "08:00:00" ) ;
LocalTime stop = LocalTime.parse( "13:00:00" ) ;

Duration

Duration オブジェクトを取得して、期間を表します。

Duration d = Duration.between( start , stop ) ;

ChronoUnit

時間数については、 ChronoUnit を使用します。

long hours = ChronoUnit.HOURS.between( start , stop ) ;

Android

Androidの場合は、ThreeTen-BackportおよびThreeTenABPプロジェクトを参照してください。以下の最後の箇条書きを参照してください。

ZonedDateTime

深夜を過ぎて日をまたぐ場合は、日付とタイムゾーンを割り当てる必要があります。

日付を決定するには、タイムゾーンが重要です。いつでも、日付はゾーンごとに世界中で異なります。たとえば、 パリフランス の真夜中から数分後は新しい日ですが、 モントリオールケベック ではまだ「昨日」です。

適切なタイムゾーン名continent/regionの形式で指定します。たとえば、 America/MontrealAfrica/Casablanca 、またはPacific/AucklandESTISTなどの3〜4文字の省略形は、そのままでは使用しないでくださいnot真のタイムゾーンであり、標準化されておらず、一意でもありません(!)。

ZoneId z = ZoneId.of( "America/Montreal" ) ;

ZonedDateTime start = ZonedDateTime.of( 
    LocalDate.of( 2017 , Month.JANUARY , 23 ) ,
    LocalTime.parse( "08:00:00" ) , 
    z
) ;

ZonedDateTime stop = ZonedDateTime.of( 
    LocalDate.of( 2017 , Month.JANUARY , 25 ) ,
    LocalTime.parse( "13:00:00" ) , 
    z
) ;

long hours = ChronoUnit.HOURS.between( start , stop ) ;

これを参照してください コードはIdeOne.comでライブで実行されます

53


Java.timeについて

Java.time フレームワークはJava 8以降に組み込まれています。これらのクラスは、厄介な古い legacy などの日時クラスに取って代わります。 Java.util.DateCalendar 、& SimpleDateFormat

Joda-Time プロジェクトは、現在 メンテナンスモード であり、 Java.time クラスへの移行をアドバイスします。

詳細については、 Oracleチュートリアル を参照してください。そして、StackOverflowで多くの例と説明を検索してください。仕様は JSR 31 です。

Java.timeクラスはどこで入手できますか?

5
Basil Bourque

午前9時が翌日であることが確実な場合も、次のようなことを試すことができます。1日を追加して、差を計算できます。

String string1 = "05:00:00 PM";
    Date time1 = new SimpleDateFormat("HH:mm:ss aa").parse(string1);
    Calendar calendar1 = Calendar.getInstance();
    calendar1.setTime(time1);

    String string2 = "09:00:00 AM";
    Date time2 = new SimpleDateFormat("HH:mm:ss aa").parse(string2);
    Calendar calendar2 = Calendar.getInstance();
    calendar2.setTime(time2);
    calendar2.add(Calendar.DATE, 1);

    Date x = calendar1.getTime();
    Date xy = calendar2.getTime();
    long diff = x.getTime() - xy.getTime();
    diffMinutes = diff / (60 * 1000);
    float diffHours = diffMinutes / 60;
    System.out.println("diff hours" + diffHours);
2
Srikanth Roopa
Try simple piece of code using For 24 hour time
StartTime = "10:00";
EndTime = "13:00";
here starthour=10 and end hour=13 

if(TextUtils.isEmpty(txtDate.getText().toString())||TextUtils.isEmpty(txtDate1.getText().toString())||TextUtils.isEmpty(txtTime.getText().toString())||TextUtils.isEmpty(txtTime1.getText().toString()))
    {
        Toast.makeText(getApplicationContext(), "Date/Time fields cannot be blank", Toast.LENGTH_SHORT).show();
    }
    else {
        if (starthour > endhour) {
            Toast.makeText(getApplicationContext(), "Start Time Should Be Less Than End Time", Toast.LENGTH_SHORT).show();
        } else if (starthour == endhour) {
            if (startmin > endmin) {
                Toast.makeText(getApplicationContext(), "Start Time Should Be Less Than End Time", Toast.LENGTH_SHORT).show();
            }
            else{
                tvalid = "True";
            }
        } else {
            // Toast.makeText(getApplicationContext(),"Sucess"+(endhour-starthour)+(endmin-startmin),Toast.LENGTH_SHORT).show();
            tvalid = "True";
        }
    }
same for date also
0

私はそれをこのように解決しました:

Date time1 = new SimpleDateFormat("HH:mm:ss aa").parse(string1);
Calendar calendar1 = Calendar.getInstance();
calendar1.setTime(time1);

Date time2 = new SimpleDateFormat("HH:mm:ss aa").parse(string2);
Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(time2);

if(calendar2.get(Calendar.AM_PM) == 1 && calendar1.get(Calendar.AM_PM) == 0)     {
     calendar2.add(Calendar.DATE, 1);
}
long diff = calendar1.getTimeInMillis() - calendar2.getTimeInMillis()

これは、24時間体制で時間の違いを見つけるのに役立ちます。

0
Pratima