web-dev-qa-db-ja.com

Javaの時定数?

Java分/時間/日/年のミリ秒/秒/分などのすべての迷惑な時定数を含むパッケージがありますか?私はそのような何かを複製したくない。

61
Yossale

Joda-Time には Days などのクラスが含まれ、 toStandardSeconds() などのメソッドが含まれます。だからあなたは書くことができます:

int seconds = Days.ONE.toStandardSeconds();

少し冗長に見えますが、おそらくうるう年などのより複雑なシナリオでのみ有用です。

22
Brian Agnew

私はJava TimeUnit を使用します。プロジェクトにjoda-timeをすでに含めていない場合。外部ライブラリを含める必要はなく、かなり簡単です。 。

これらの「いらいらさせる定数」が必要なときはいつでも、通常、ユニット間変換のために複数の数値を必要とします。代わりに、TimeUnitを使用して、明示的な乗算なしで値を単純に変換できます。

この:

long millis = hours * MINUTES_IN_HOUR * SECONDS_IN_MINUTE * MILLIS_IN_SECOND;

これになります:

long millis = TimeUnit.HOURS.toMillis(hours);

たとえば、millisで値を受け入れるメソッドを公開し、それを変換する必要がある場合、Java同時実行APIが行うことを実行することをお勧めします。

public void yourFancyMethod(long somePeriod, TimeUnit unit) {
    int iNeedSeconds = unit.toSeconds(somePeriod);
}

非常にひどく定数が本当に必要な場合は、次を呼び出して1時間で秒を取得できます:

int secondsInHour = TimeUnit.HOURS.toSeconds(1);
113
theadam

Androidの場合:

Android.text.format.DateUtils

DateUtils.SECOND_IN_MILLIS
DateUtils.MINUTE_IN_MILLIS
DateUtils.HOUR_IN_MILLIS
DateUtils.DAY_IN_MILLIS
DateUtils.WEEK_IN_MILLIS
DateUtils.YEAR_IN_MILLIS
34
Oded Breiner

Java 8/Java.timeソリューション

TimeUnitの代替として、何らかの理由で Duration class fromJava.timeパッケージを好むかもしれません:

Duration.ofDays(1).getSeconds()     // returns 86400;
Duration.ofMinutes(1).getSeconds(); // 60
Duration.ofHours(1).toMinutes();    // also 60
//etc.

さらに、さらに深く、Duration.ofDays(..)メソッドの動作を分析した場合、次のコードが表示されます。

return create(Math.multiplyExact(days, SECONDS_PER_DAY), 0);

どこ SECONDS_PER_DAYは、 LocalTime クラスのパッケージ保護された静的定数です。

/**
 * Seconds per day.
 */
static final int SECONDS_PER_DAY = SECONDS_PER_HOUR * HOURS_PER_DAY;

//there are also many others, like HOURS_PER_DAY, MINUTES_PER_HOUR, etc.

あなたがそれらを呼び出すときに「ミリ秒/秒/分などのすべての迷惑な時定数」を定義するパッケージがあると仮定するのは安全だと思いますJava SDK Developersそれらを使用しているでしょう。

なぜこのLocalTime定数パッケージが保護されており、公開されていないのが良い質問なのか、その理由があると思います。今のところ、あなたは本当にそれらをコピーして自分で保守しなければならないように見えます。

27
Mateusz Szulc

Java TimeUnit はあなたが望むもののようです

14
Martin

Joda Timeには、MILLIS_PER_SECOND、SECONDS_PER_MINUTE、MILLIS_PER_DAYなどのようなものを持つ DateTimeConstants クラスもあります。

11

これが、ミリ秒を取得するために使用するものです。

import javax.management.timer.Timer;

Timer.ONE_HOUR
Timer.ONE_DAY
Timer.ONE_MINUTE
Timer.ONE_SECOND
Timer.ONE_WEEK
2
Reaz Murshed

this Answer で説明されているTimeUnitおよび this Answer で説明されているDurationはおそらく質問をより直接的に扱っていますが、他にも便利な単位がいくつかありますJavaの時間機能。

Java.time

Java.timeパッケージ には DayOfWeek および Month の洗練された列挙型があります。したがって、単なる数字や文字列を渡すのではなく、DayOfWeek.TUESDAYMonth.FEBRUARYなどの本格的なオブジェクトを渡すことができます。

Java.timeフレームワークには、MonthDayYearMonth、およびYearなどのクラスも含まれています。繰り返しますが、単なる数値や文字列ではなく、本格的なオブジェクトを渡して、コードをより自己文書化し、有効な値を確保し、タイプセーフを提供できます。

ThreeTen-Extraプロジェクト

ThreeTen-Extra プロジェクトは、Java.timeで動作する追加のクラスを提供します。これらには以下が含まれます:DayOfMonthDayOfYearAmPmQuarterYearQuarterYearWeekDaysWeeksMonthsYears、およびInterval

2
Basil Bourque

すでにベイク処理された(複数呼び出しの)Durationインスタンス(および0の数学演算)を使用したもう1つのアプローチ:

ChronoUnit.DAYS.getDuration().getSeconds()
1

それらはすべて定数ではないため、私はそれを疑います。 1年のミリ秒数はさまざまですよね?

0
duffymo

値を取得する場合は、Calendarに時間管理に関連するすべてのフィールドがあります。

Field [] fields = Calendar.class.getFields();

for (Field f : fields)
{
  String fName = f.toString();
  System.out.println(fName.substring(fName.lastIndexOf('.')+1).replace("_", " ").toLowerCase());
}

これは出力されます:

era
year
month
week of year
week of month
date
day of month
day of year
day of week
day of week in month
am pm
hour
hour of day
minute
second
millisecond
zone offset
dst offset
field count
sunday
monday
tuesday
wednesday
thursday
friday
saturday
january
february
march
april
may
june
july
august
september
october
november
december
undecimber
am
pm
all styles
short
long

不要なものを除外することができます。

定数だけが必要な場合は、Calendar.DAY_OF_MONTHCalendar.YEAR 等々..

0
Jack