2012-12-15 3 views
12

私は、UNIXタイムスタンプを使用してデータベースに時刻/日付を格納しています。 特定の日にすべてのインスタンスを取得したいので、データベースを照会するために開始日のタイムスタンプを計算する必要があります。開始時刻のタイムスタンプを取得

私はPHPで似たようなことを、日付オブジェクトから日/月/年の値をmktimeに渡し、時と分をゼロに設定しています。 java/androidでこれに似た関数はないようです(日付の特定の部分を取得する関数は非難されています)

誰かがこれに関するいくつかの指針を与えることができますか?おかげ

は編集:

[OK]をので、私は、これはうまくいくかもしれない実現:私はこれを実行したときに

public static int startOfDay(Timestamp time) { 
     Calendar cal = dateToCalendar(new Date(time.getTime())); 
     cal.add(Calendar.HOUR_OF_DAY, -Calendar.HOUR_OF_DAY); 
     cal.add(Calendar.MINUTE, -Calendar.MINUTE); 
     cal.add(Calendar.SECOND, -Calendar.SECOND); 
     Log.i("Time", cal.getTime().toString());   
     return (int) cal.getTimeInMillis()/1000; 
} 

は、しかし今私が得た:

土12月15日1時24分00秒GMT 2012

秒は正しく、時と分は間違っていますか?

答えて

32

時間を扱うときは、常にタイムゾーンを考慮する必要があります。データベースのタイムスタンプは常に1つのタイムゾーン(たとえば、UTC)に保存する必要があります。あなたの計算では、ユーザーが異なるタイムゾーンにいる可能性があり、タイムゾーンを変更できることを考慮する必要があります。

ユーザーが現在自分の電話機に設定しているタイムゾーンでの曜日の開始時刻を計算したい場合は、特定の時間帯に使用するためのインスタンスを取得するには

Calendar cal = Calendar.getInstance(); 

:でCalendarインスタンスを作成します。次に

// use UTC time zone 
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")); 

日の初めに設定します。

cal.setTime(time); // compute start of the day for the timestamp 
cal.set(Calendar.HOUR_OF_DAY, 0); 
cal.set(Calendar.MINUTE, 0); 
cal.set(Calendar.SECOND, 0); 
cal.set(Calendar.MILLISECOND, 0); 
6
public static int startOfDay(Timestamp time) { 
    Calendar cal = Calendar.getInstance(); 
    cal.setTimeInMillis(time.getTime()); 
    cal.set(Calendar.HOUR_OF_DAY, 0); //set hours to zero 
    cal.set(Calendar.MINUTE, 0); // set minutes to zero 
    cal.set(Calendar.SECOND, 0); //set seconds to zero 
    Log.i("Time", cal.getTime().toString());   
    return (int) cal.getTimeInMillis()/1000; 
} 
+0

ああ、ありがとう、このように働いて実現しませんでした。 –

+0

このメソッドを呼び出す方法 –

1

TLを、DR

ZoneId z = ZoneId.of("America/Montreal"); 
long secondsSinceEpoch = ZonedDateTime.now(z).toLocalDate().asStartOfDay(z).toEpochSecond() ; 

詳細

受け入れられたAnswer by Tomikは正確ですが、時代遅れです。面倒な古いレガシー日時クラスはjava.timeクラスに取って代わられています。

答えが示されているので、1日の始まりを知るには、時間帯を考慮する必要があります。タイムゾーンは日付を決定する際に重要です。任意の瞬間について、日付は地球の周りでゾーンごとに異なります。たとえば、フランスの深夜0時から数分後、モントリオール・ケベックではまだ「昨日」の間、新しい日があります。

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

最初の瞬間を得るには、LocalDateが必要です。 LocalDateクラスは、時間帯のない時間帯のない日付のみの値を表します。

LocalDate today = zdt.toLocalDate(); 
ZonedDateTime zdtTodayStart = today.atStartOfDay(z); 

javaにしてください。時間は、仮定してハードコード00:00:00を想定するのではなく、開始日を決定する。夏時間(DST)およびその他の異常のため、01:00:00のような別の時刻に日が開始されることがあります。

明らかに、unix timestampは、1970年の最初の瞬間からUTCでの秒数を意味します。 ZonedDateTimeクラスには、その番号を与えるメソッドがあります。 ZonedDateTimeは、ナノ秒の分解能で1秒未満の時間を持つ可能性があるため、データ損失を意味することに注意してください。 java.timeについて

long secondsSinceEpoch = zdtTodayStart.toEpochSecond(); 

java.timeフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは、java.util.Date.Calendar、& java.text.SimpleDateFormatなどの面倒な古い日時クラスに取って代わります。

にあるJoda-Timeプロジェクトは、java.timeへの移行を推奨しています。

詳しくはOracle Tutorialをご覧ください。そして、多くの例と説明のためにStack Overflowを検索してください。

java.time機能ThreeTen-BackportでJava 6 & 7に戻って、移植、さらにThreeTenABPAndroidに適合されているの多く(How to use…を参照)。

ThreeTen-Extraプロジェクトは、追加のクラスでjava.timeを拡張します。このプロジェクトは、将来のjava.timeへの追加の可能性を証明する土台です。ここでは、IntervalYearWeekYearQuarterなどの便利なクラスがあります。

3

この簡単な解決策についてどう思いますか?

Long currentDayStart = timestamp - timestamp%86400000; 
Long currentDayEnd = timestamp+86399999; 

タイムスタンプのタイムゾーンを変更する必要はありません。その他の情報: https://stackoverflow.com/a/23062640

関連する問題