1

ユーザーが操作の開始時間を選択する小さなAndroidアプリを構築しています。

私はTimerPickerDialogを使用しています:

mTimePicker = new TimePickerDialog(getContext(), new TimePickerDialog.OnTimeSetListener() {
    @Override
    public void onTimeSet(TimePicker timePicker, int selectedHour, int selectedMinute) {
        startTimeHours = selectedHour;
        startTimeMinutes = selectedMinute;
}, hour, minute, is24hours);

時間を選択すると、時間の int と分の int が返され、グローバル変数として保存されます。

後でアプリで、これらの数値を Time オブジェクトに変換して、現在の時間がそのクラスで表されている時間よりも大きいか小さいかを確認します。

私がやったことはこれです:

Time tStart = new Time(startTimeHours, startTimeMinutes, 0);

しかし、eclips は、このコンストラクターは非推奨であると言っています。ただし、時間がかかるコンストラクターは非推奨ではないようです。

周りを見回したところ、ある投稿で誰かが Calendar オブジェクトの使用を勧めていましたが、私にはそれがわかりませんでした。その新しいインスタンスを取得して時間を設定する方法です。時間を含むだけのオーバーヘッドのように見えます。

このようなシナリオのベスト プラクティスは何ですか? long 変数を受け入れるコンストラクターを使用する必要がある場合 - 2 つの整数をその long 値に変換するにはどうすればよいですか?

4

3 に答える 3

3

EDIT2:

これは、Date時間の異なる 2 つのオブジェクトを作成し、後でそれらを比較する方法です。

Calendar calendar = Calendar.getInstance(); // By default the date and time is set to now

// Create first date
calendar.set(Calendar.HOUR_OF_DAY, 20);
calendar.set(Calendar.MINUTE, 5);
Date dateOne = calendar.getTime();

// Create second date
calendar.set(Calendar.HOUR_OF_DAY, 17);
calendar.set(Calendar.MINUTE, 36);
Date dateTwo = calendar.getTime();

// With before() you can check if a Date is before some other date
if(dateOne.before(dateTwo)) {
    // dateOne is before dateTwo
} else {
    // dateTwo is before dateOne
}

一部が他の後after()に続くかどうかを確認するために使用することもできます。DateDate


編集:

Long質問の最後の段落であなたが話しているその値は、ミリ秒単位のエポック時間です。Timeフレームワークからこのクラスを使用するべきではありません。私はあなたがこれを意味すると思いますか?以下に投稿したソリューションを使用する必要があります。


元の答え:

Date私は主にオブジェクトをコンテナとして使用する傾向があります。Dateインスタンスを作成するベスト プラクティスは、Calendarオブジェクトを使用することです。次のようなことを試してください:

// We get a Calendar instance with getInstance();
Calendar calendar = Calendar.getInstance();

// Now we set the date we want.
calendar.set(Calendar.YEAR, 2014);
calendar.set(Calendar.MONTH, 4);  // Be carefull, months start at 0. January = 0, Feburary = 1, March = 2,...
calendar.set(Calendar.DAY_OF_MONTH, 29);
calendar.set(Calendar.HOUR_OF_DAY, 20);
calendar.set(Calendar.MINUTE, 5);

// And finally we create the `Date` instance with getTime()
Date date = calendar.getTime();

// You can also do the reverse and set the time in a `Calendar` instance from a `Date` instance.
calendar.setTime(date);

これは非常にシンプルでCalendar非常に強力ですが、あなたには適していないと思います。このソリューションはDateオブジェクトを作成するためです。そのため、時間や分だけでなく、はるかに多くの情報を保存できます。

それがあなたの状況に当てはまるかどうかを判断する必要があります。本当に時間と分を保存したいだけなら、次のTimeようなカスタムクラスを作成することをお勧めします:

public class Time {

    private int minute;
    private int hour;

    public int getMinute() {
        return minute;
    }

    public void setMinute(int minute) {
        this.minute = minute;
    }

    public int getHour() {
        return hour;
    }

    public void setHour(int hour) {
        this.hour = hour;
    }
}

必要に応じて、このTimeクラスに検証と計算を追加することもできますが、これも何をしたいかによって異なります。

より正確な回答を提供できます。どのような種類の時間値を保存する必要があるかについて詳しく教えていただければ、より正確には日付情報も保存する必要がありますか?

于 2014-05-30T13:14:53.000 に答える
1

Date を含むコンテキスト以外では実際には何の用途もない Time オブジェクトのように、使用が制限されているクラスを作成するのに時間を費やすのではなく、Date をより簡単に操作できるようにすることに集中してください。

カレンダーで set メソッドを使用するのは非常に面倒で、見苦しいものです。Java 8 では、これが原因で、日付/時刻関連の機能が大幅に拡張されました。

そうは言っても、私は少し前にうんざりして、次のようなアプローチを使用して日付を簡単に構築できるように、流暢なビルダー デザイン パターンを使用する DateBuilder を作成しました。

Date newDate = new DateBuilder().hour(10).minute(20).build();

最終的に、私は真夜中を与えたり、時間を追加させたりするなど、迷惑な他の便利な機能を追加しました。Java で Dates が機能する方法で本当に嫌なことは、大量のコードを記述していることに気付くことです。それは見苦しく、周囲のコードの可読性が大幅に低下します。Builder はそれを区分化します。

人々を驚かせるのは、自分のクラスにジャンプして add 関数のようなものを追加するのがいかに簡単かということです。

new DateBuilder(new Date()).addDays(3).build();

私は 8 で新しい日付のものをいじってみました。Joda も優れていますが、面白いのは最終的に私が Joda をあまり好きではなくなったことです。なぜなら、Joda の方が優れていたのですが、コードに同じことをいくつか持ち込んだだけで、ライブラリの最も重要なテストの 1 つに失敗したからです。採用: 使用するたびにドキュメントに戻って読む必要がありました。Objective-C でカテゴリを使用することで、流動的に使用するものを作成する可能性が高いため (名前の由来)、自分が触れるコードの最上層を作成するのが最善であることが多いと確信しました。準 DSL: 別のドメインでプログラミングを行う場合、他のことを強調した別の DateBuilder が必要になる場合があります。

于 2014-05-30T13:25:11.997 に答える