programing

Java의 시간 상수?

nasanasas 2020. 11. 22. 19:51
반응형

Java의 시간 상수?


분 / 시간 / 일 / 년에 밀리 초 / 초 / 분과 같은 모든 성가신 시간 상수가있는 Java 패키지가 있습니까? 나는 그런 것을 복제하고 싶지 않습니다.


Joda-Time 에는 toStandardSeconds () 와 같은 메서드를 포함하는 Days 와 같은 클래스 가 포함되어 있습니다 . 따라서 다음과 같이 작성할 수 있습니다.

int seconds = Days.ONE.toStandardSeconds();

약간 장황 해 보이지만 윤년 등과 같은 더 복잡한 시나리오에만 유용 할 수 있습니다.


프로젝트에 joda-time을 이미 포함하지 않은 경우 Java TimeUnit을 사용합니다. 외부 라이브러리를 포함 할 필요가 없으며 매우 간단합니다.

이러한 "성가신 상수"가 필요할 때마다 일반적으로 교차 단위 변환을 위해 여러 개의 숫자가 필요합니다. 대신 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);

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

Java 8 / java.time 솔루션

에 대한 대안으로 TimeUnit어떤 이유로 java.time 패키지 Duration 클래스를 선호 할 수 있습니다 .

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 개발자가 사용했을 것이라고 생각하는 것이 안전하다고 생각합니다.

LocalTime상수 패키지가 보호되고 공개되지 않는 이유는 좋은 질문입니다. 그 이유가 있다고 생각합니다. 지금은 정말로 그것들을 복사하고 스스로 유지해야하는 것처럼 보입니다.


Java TimeUnit 이 원하는 것 같습니다.


Joda Time에는 DateTimeConstantsMILLIS_PER_SECOND, SECONDS_PER_MINUTE, MILLIS_PER_DAY 등과 같은 클래스 도 있습니다 .


반면 TimeUnit에 기술 이 대답Duration논의 ,이 대답은 아마 더 직접적으로 질문을 해결, 자바에서 다른 편리한 단위-의 시간 기능이 있습니다.

java.time

java.time 패키지는 정교한 열거 가지고 DayOfWeekMonth. 그래서 오히려 단순한 숫자 또는 문자열 주위 패스보다 당신과 같은 본격적인 개체를 전달할 수 있습니다 DayOfWeek.TUESDAY또는 Month.FEBRUARY.

java.time 프레임 워크는 또한 다음과 같은 클래스를 포함하고 MonthDay, YearMonth그리고 Year. 다시 말하지만, 단순한 숫자 나 문자열이 아닌 완전한 객체를 전달하여 코드를보다 자체 문서화하고 유효한 값을 보장하며 형식 안전성을 제공 할 수 있습니다.

ThreeTen-Extra 프로젝트

ThreeTen - 추가 프로젝트는 java.time와 작업에 추가 클래스를 제공합니다. 이들은 다음과 같습니다 : DayOfMonth, DayOfYear, AmPm, Quarter, YearQuarter, YearWeek, Days, Weeks, Months, Years,와 Interval.


다음은 밀리 초를 얻기 위해 사용하는 것입니다.

import javax.management.timer.Timer;

Timer.ONE_HOUR
Timer.ONE_DAY
Timer.ONE_MINUTE
Timer.ONE_SECOND
Timer.ONE_WEEK

이미 베이크 된 (다중 호출 용) Duration인스턴스 (및 0 수학 연산)가있는 또 다른 접근 방식 :

ChronoUnit.DAYS.getDuration().getSeconds()

              60 * 1000 miliseconds in 1 minute
                     60     seconds in 1 minute
                      1      minute in 1 minute
                   1/60       hours in 1 minute
              1/(60*24)        days in 1 minute
          1/(60*24*365)       years in 1 minute
1/(60*24*(365 * 4 + 1))     4 years in 1 minute
                                                * 60            is in 1 hour
                                                * 60 * 24       is in 1 day
                                                * 60 * 24 * 365 is in 1 year
                                            etc.

직접 만드는 것이 가장 쉬운 것 같습니다. DateCalendar클래스를 사용하여 시간 및 날짜로 계산을 수행 할 수 있습니다 . long1970 년 1 월 1 일 UTC의 밀리 초와 같이 큰 숫자로 작업 하려면 데이터 유형을 사용하십시오 System.currentTimeMillis().


나는 그것들이 모두 상수가 아니기 때문에 그것을 의심합니다. 1 년 동안의 밀리 초는 다양합니다. 그렇죠?


If you mean to obtain the values Calendar have all fields related to time management, with some simple reflection you can do

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

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

this will output:

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

from which you can exclude what you don't need.

If you need just constants you have them: Calendar.DAY_OF_MONTH, Calendar.YEAR and so on..

참고URL : https://stackoverflow.com/questions/2442486/time-consts-in-java

반응형