IT

자바에서는 시간이 변합니까?

itgroup 2022. 10. 30. 21:11
반응형

자바에서는 시간이 변합니까?

1분/시간/일/년 단위의 밀리초/초/분 등 성가신 시간 상수가 모두 포함된 Java 패키지가 있습니까?나는 그런 것을 복제하고 싶지 않다.

아직 joda-time을 프로젝트에 포함하지 않았다면 java TimeUnit으로 하겠습니다.외부 lib를 포함할 필요는 없으며 매우 간단합니다.

이러한 "유발 상수"가 필요할 때마다 교차 단위 변환을 위해 몇 가지 숫자를 뮤트립해야 합니다.대신 TimeUnit을 사용하여 명시적으로 곱하지 않고 단순히 값을 변환할 수 있습니다.

이것은, 다음과 같습니다.

long millis = hours * MINUTES_IN_HOUR * SECONDS_IN_MINUTE * MILLIS_IN_SECOND;

다음과 같이 됩니다.

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

예를 들어 millis 값을 받아들이고 변환해야 하는 메서드를 노출하는 경우 Java concurrency API가 수행하는 작업을 따르는 것이 좋습니다.

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

정수가 꼭 필요한 경우 다음 번호로 전화를 걸어 1시간 내에 몇 초를 얻을 수 있습니다.

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

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_DAYLocalTime 클래스의 패키지로 보호된 스태틱 상수입니다.

/**
 * 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 개발자들이 그것들을 사용했을 것이라고 추측해도 무방할 것 같습니다.

왜 게?이에요?LocalTimepublic에는 합니다.그것은 이유가 있다고 생각합니다.지금으로서는, 정말로 카피하고, 스스로 관리해야 할 것 같습니다.

Android의 경우 다음을 권장합니다.

optroid.text.format 입니다.날짜 사용

DateUtils.SECOND_IN_MILLIS
DateUtils.MINUTE_IN_MILLIS
DateUtils.HOUR_IN_MILLIS
DateUtils.DAY_IN_MILLIS
DateUtils.WEEK_IN_MILLIS
DateUtils.YEAR_IN_MILLIS

Joda-Time에는 Days 의 클래스가 포함되어 있습니다.이 클래스에는 toStandardSeconds() 등의 메서드가 포함됩니다.다음과 같이 쓸 수 있습니다.

int seconds = Days.ONE.toStandardSeconds();

조금 장황하게 보이고 윤년 등 복잡한 시나리오에서만 유용할 수 있습니다.

Java Time Unit은 당신이 원하는 것 같습니다.

Joda Time에는 MILLIS_PER_SECond, SEConds_PER_MINUTE, MILLIS_PER_DAY 등의 클래스도 있습니다.

밀리초를 얻기 위해 사용하는 방법은 다음과 같습니다.

import javax.management.timer.Timer;

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

하는 동안에TimeUnit 회답에서 설명하고 있습니다.Duration 답변에서 설명하는 것은 아마도 이 질문에 더 직접적으로 대처할 것입니다. Java에는 다른 편리한 시간 단위 기능이 몇 가지 있습니다.

java.time

유닛에 대해서는, 다음의 열거를 참조해 주세요.

  • FOREVER
  • ERAS
  • MILLENNIA
  • CENTURIES
  • DECADES
  • YEARS
  • MONTHS
  • WEEKS
  • DAYS
  • HALF_DAYS
  • HOURS
  • MINUTES
  • SECONDS
  • MILLIS
  • MICROS
  • NANOS

java.time 패키지에는 및 에 대한 고급 Enum이 포함되어 있습니다.따라서 숫자나 문자열만 전달하는 것이 아니라 다음과 같은 본격적인 개체를 전달할 수 있습니다.DayOfWeek.TUESDAY또는Month.FEBRUARY.

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

사이의 변환TimeUnit그리고.ChronoUnit

쉽게 변환할 수 있습니다.TimeUnit그리고.ChronoUnit오래된 클래스에 추가된 새로운 메서드를 참조하십시오.TimeUnit.

ThreeTen-Extra 프로젝트

ThreeTen-Extra 프로젝트는 java.time을 사용하는 추가 클래스를 제공합니다.여기에는 다음이 포함됩니다.DayOfMonth,DayOfYear,AmPm,Quarter,YearQuarter,YearWeek,Days,Weeks,Months,Years,그리고.Interval.

이미 베이킹된 접근방식 1개 추가(복수 콜용)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.

직접 만드는 게 가장 쉬울 것 같아요.를 사용할 수 있습니다.Date그리고.Calendar시간 및 날짜를 사용하여 계산을 수행합니다.를 사용합니다.long1970년 1월 1일 UTC로부터의 밀리초 등, 큰 수치로 동작하는 데이터 타입.System.currentTimeMillis().

값을 얻으려면Calendar시간 관리와 관련된 모든 필드를 가지고 있으며 간단한 반성을 통해 수행할 수 있습니다.

필드 []필드 = 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_MONTH,Calendar.YEAR기타 등등..

상수를 컴파일 시간 상수(예를 들어 주석의 속성)로 사용하는 경우,Apache DateUtils도움이 될 거야

import org.apache.commons.lang.time.DateUtils;
DateUtils.MILLIS_PER_SECOND
DateUtils.MILLIS_PER_MINUTE
DateUtils.MILLIS_PER_HOUR
DateUtils.MILLIS_PER_DAY

이것들은 원시적인 긴 상수입니다.

언급URL : https://stackoverflow.com/questions/2442486/time-consts-in-java

반응형