달력에 대한 날짜 개체 [자바]
클래스 영화가 있습니다. 시작 날짜, 기간 및 중지 날짜가 있습니다. 시작 및 중지 날짜는 날짜 개체입니다 (비공개 날짜 startDate ...) (할당이므로 변경할 수 없습니다) 이제 startDate에 기간 (분 단위)을 추가하여 stopDate를 자동으로 계산하고 싶습니다.
내 지식으로 Date의 시간 조작 기능은 더 이상 사용되지 않으므로 나쁜 습관이지만 다른 쪽에서는 시간을 조작하고 Date 객체로 다시 변환하기 위해 Date 객체를 달력 객체로 변환하는 방법이 없습니다. 방법이 있습니까? 그리고 모범 사례가 있다면
할 수있는 일은의 인스턴스를 만든 GregorianCalendar
다음 Date
시작 시간으로 설정하는 것입니다.
Date date;
Calendar myCal = new GregorianCalendar();
myCal.setTime(date);
그러나 다른 방법은 전혀 사용하지 않는 것 Date
입니다. 다음과 같은 접근 방식을 사용할 수 있습니다.
private Calendar startTime;
private long duration;
private long startNanos; //Nano-second precision, could be less precise
...
this.startTime = Calendar.getInstance();
this.duration = 0;
this.startNanos = System.nanoTime();
public void setEndTime() {
this.duration = System.nanoTime() - this.startNanos;
}
public Calendar getStartTime() {
return this.startTime;
}
public long getDuration() {
return this.duration;
}
이 방법으로 시작 시간에 액세스하고 시작부터 중지까지의 기간을 가져올 수 있습니다. 물론 정밀도는 당신에게 달려 있습니다.
Calendar tCalendar = Calendar.getInstance();
tCalendar.setTime(date);
date는 java.util.Date 객체입니다. Calendar.getInstance ()를 사용하여 Calendar 인스턴스를 얻을 수도 있습니다 (훨씬 더 효율적).
이름뿐만 아니라 API 메서드의 서명과 설명을 보는 것이 유용 할 때가 많습니다.-Java 표준 API에서도 이름이 잘못 될 수 있습니다.
이를 위해로 변환 할 필요가 없습니다 . 대신 / 를 Calendar
사용할 수 있습니다 .getTime()
setTime()
getTime()
:이 Date 객체가 나타내는 1970 년 1 월 1 일 00:00:00 GMT 이후의 밀리 초 수를 반환합니다.
setTime(long time)
: 1970 년 1 월 1 일 00:00:00 GMT 이후의 시간 밀리 초인 시점을 나타내도록이 Date 객체를 설정합니다. )
1 초에 1000 밀리 초, 1 분에 60 초가 있습니다. 그냥 수학을하세요.
Date now = new Date();
Date oneMinuteInFuture = new Date(now.getTime() + 1000L * 60);
System.out.println(now);
System.out.println(oneMinuteInFuture);
L
에서 접미사 1000
그것이 있다는 의미 long
그대로; 이러한 계산은 일반적으로 int
쉽게 오버플로 됩니다.
tl; dr
Instant stop =
myUtilDateStart.toInstant()
.plus( Duration.ofMinutes( x ) )
;
java.time
다른 답변, 특히 Borgwardt의 답변이 정확합니다 . 그러나 그 답변은 오래된 레거시 클래스를 사용합니다.
Java와 함께 번들로 제공되는 원래 날짜-시간 클래스는 java.time 클래스로 대체되었습니다. java.time 유형에서 비즈니스 로직을 수행하십시오. java.time 유형을 처리하기 위해 아직 업데이트되지 않은 이전 코드로 작업해야하는 경우에만 이전 유형으로 변환하십시오.
귀하의 경우 Calendar
실제로있는 GregorianCalendar
당신은로 변환 할 수 있습니다 ZonedDateTime
. java.time 유형과의 변환을 용이하게하기 위해 이전 클래스에 추가 된 새 메소드를 찾으십시오.
if( myUtilCalendar instanceof GregorianCalendar ) {
GregorianCalendar gregCal = (GregorianCalendar) myUtilCalendar; // Downcasting from the interface to the concrete class.
ZonedDateTime zdt = gregCal.toZonedDateTime(); // Create `ZonedDateTime` with same time zone info found in the `GregorianCalendar`
end if
If your Calendar
is not a Gregorian
, call toInstant
to get an Instant
object. The Instant
class represents a moment on the timeline in UTC with a resolution of nanoseconds.
Instant instant = myCal.toInstant();
Similarly, if starting with a java.util.Date
object, convert to an Instant
. The Instant
class represents a moment on the timeline in UTC with a resolution of nanoseconds (up to nine (9) digits of a decimal fraction).
Instant instant = myUtilDate.toInstant();
Apply a time zone to get a ZonedDateTime
.
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
To get a java.util.Date
object, go through the Instant
.
java.util.Date utilDate = java.util.Date.from( zdt.toInstant() );
For more discussion of converting between the legacy date-time types and java.time, and a nifty diagram, see my Answer to another Question.
Duration
Represent the span of time as a Duration
object. Your input for the duration is a number of minutes as mentioned in the Question.
Duration d = Duration.ofMinutes( yourMinutesGoHere );
You can add that to the start to determine the stop.
Instant stop = startInstant.plus( d );
About java.time
The java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date
, Calendar
, & SimpleDateFormat
.
The Joda-Time project, now in maintenance mode, advises migration to java.time.
To learn more, see the Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310.
Where to obtain the java.time classes?
- Java SE 8 and SE 9 and later
- Built-in.
- Part of the standard Java API with a bundled implementation.
- Java 9 adds some minor features and fixes.
- Java SE 6 and SE 7
- Much of the java.time functionality is back-ported to Java 6 & 7 in ThreeTen-Backport.
- Android
- The ThreeTenABP project adapts ThreeTen-Backport (mentioned above) for Android specifically.
- See How to use….
The ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval
, YearWeek
, YearQuarter
, and more.
something like
movie.setStopDate(movie.getStartDate() + movie.getDurationInMinutes()* 60000);
Here is a full example on how to transform your date in different types:
Date date = Calendar.getInstance().getTime();
// Display a date in day, month, year format
DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
String today = formatter.format(date);
System.out.println("Today : " + today);
// Display date with day name in a short format
formatter = new SimpleDateFormat("EEE, dd/MM/yyyy");
today = formatter.format(date);
System.out.println("Today : " + today);
// Display date with a short day and month name
formatter = new SimpleDateFormat("EEE, dd MMM yyyy");
today = formatter.format(date);
System.out.println("Today : " + today);
// Formatting date with full day and month name and show time up to
// milliseconds with AM/PM
formatter = new SimpleDateFormat("EEEE, dd MMMM yyyy, hh:mm:ss.SSS a");
today = formatter.format(date);
System.out.println("Today : " + today);
참고URL : https://stackoverflow.com/questions/2727698/date-object-to-calendar-java
'code' 카테고리의 다른 글
Angular 1.6.0 : "아마도 처리되지 않은 거부"오류 (0) | 2020.11.14 |
---|---|
메서드가 'void'를 반환하는지 반영하여 확인하는 방법 (0) | 2020.11.14 |
실수로 푸시 된 커밋 : git 커밋 메시지 변경 (0) | 2020.11.14 |
고품질의 간단한 임의 암호 생성기 (0) | 2020.11.14 |
matplotlib에서 빈 서브 플롯을 어떻게 만들 수 있습니까? (0) | 2020.11.14 |