두 날짜 사이의 날짜를 계산하는 Java 프로그램이 필요합니다.
- 첫 번째 날짜를 입력하십시오 (독일 표기법; 공백 포함 : “dd mm yyyy”)
- 두 번째 날짜를 입력하십시오.
- 프로그램은 두 날짜 사이의 일 수를 계산해야합니다.
윤년과 여름을 어떻게 포함시킬 수 있습니까?
내 코드 :
import java.util.Calendar;
import java.util.Date;
import java.util.Scanner;
public class NewDateDifference {
public static void main(String[] args) {
System.out.print("Insert first date: ");
Scanner s = new Scanner(System.in);
String[] eingabe1 = new String[3];
while (s.hasNext()) {
int i = 0;
insert1[i] = s.next();
if (!s.hasNext()) {
s.close();
break;
}
i++;
}
System.out.print("Insert second date: ");
Scanner t = new Scanner(System.in);
String[] insert2 = new String[3];
while (t.hasNext()) {
int i = 0;
insert2[i] = t.next();
if (!t.hasNext()) {
t.close();
break;
}
i++;
}
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(insert1[0]));
cal.set(Calendar.MONTH, Integer.parseInt(insert1[1]));
cal.set(Calendar.YEAR, Integer.parseInt(insert1[2]));
Date firstDate = cal.getTime();
cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(insert2[0]));
cal.set(Calendar.MONTH, Integer.parseInt(insert2[1]));
cal.set(Calendar.YEAR, Integer.parseInt(insert2[2]));
Date secondDate = cal.getTime();
long diff = secondDate.getTime() - firstDate.getTime();
System.out.println ("Days: " + diff / 1000 / 60 / 60 / 24);
}
}
답변
업데이트 : 일부 클래스가 교체되어 2013 년의 원래 답변이 구식입니다. 이 작업을 수행하는 새로운 방법은 새 java.time
클래스를 사용하는 것 입니다.
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd MM yyyy");
String inputString1 = "23 01 1997";
String inputString2 = "27 04 1997";
try {
LocalDateTime date1 = LocalDate.parse(inputString1, dtf);
LocalDateTime date2 = LocalDate.parse(inputString2, dtf);
long daysBetween = Duration.between(date1, date2).toDays();
System.out.println ("Days: " + daysBetween);
} catch (ParseException e) {
e.printStackTrace();
}
이 솔루션은 달력 일 수가 아닌 실제 24 시간의 일 수를 제공합니다. 후자의 경우
long daysBetween = ChronoUnit.DAYS.between(date1, date2)
원문 답변 (자바 8 이전)
필요하지 않은 문자열로 변환하고 있습니다. SimpleDateFormat
그것에 대한 수업이 있습니다-이것을 시도하십시오 :
SimpleDateFormat myFormat = new SimpleDateFormat("dd MM yyyy");
String inputString1 = "23 01 1997";
String inputString2 = "27 04 1997";
try {
Date date1 = myFormat.parse(inputString1);
Date date2 = myFormat.parse(inputString2);
long diff = date2.getTime() - date1.getTime();
System.out.println ("Days: " + TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS));
} catch (ParseException e) {
e.printStackTrace();
}
편집 : 이 코드의 정확성에 관한 몇 가지 토론이 있었으므로 실제로 윤년을 처리합니다. 그러나 TimeUnit.DAYS.convert
밀리 초가 일로 변환되므로 함수의 정밀도가 떨어집니다 (자세한 내용은 링크 된 문서 참조). 이것이 문제인 경우 diff
수동으로 변환 할 수도 있습니다.
float days = (diff / (1000*60*60*24));
이 float
값 은 반드시 값일 필요는 없습니다 int
.
답변
가장 간단한 방법 :
public static long getDifferenceDays(Date d1, Date d2) {
long diff = d2.getTime() - d1.getTime();
return TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS);
}
답변
Java 8에서는 LocalDate
and 를 사용하여이를 수행 할 수 DateTimeFormatter
있습니다. 로부터 의 Javadoc 의 LocalDate
:
LocalDate는 날짜를 나타내는 변경 불가능한 날짜-시간 객체이며, 종종 연월일로 표시됩니다.
패턴을 사용하여 구성 할 수 있습니다 DateTimeFormatter
. 다음은 Javadoc 및 내가 사용한 관련 패턴 문자입니다.
기호 -의미- 프리젠 테이션 -예
Y – 년의 시대 – 년 – 2004; 04
M / L- 년- 숫자 / 텍스트 -7; 07; 7 월; 칠월; 제이
d- 월- 숫자 -10
예를 들면 다음과 같습니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
public class Java8DateExample {
public static void main(String[] args) throws IOException {
final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd MM yyyy");
final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
final String firstInput = reader.readLine();
final String secondInput = reader.readLine();
final LocalDate firstDate = LocalDate.parse(firstInput, formatter);
final LocalDate secondDate = LocalDate.parse(secondInput, formatter);
final long days = ChronoUnit.DAYS.between(firstDate, secondDate);
System.out.println("Days between: " + days);
}
}
가장 최근의 입력 / 출력 예 :
23 01 1997
27 04 1997
Days between: 94
더 최근의 첫 번째 :
27 04 1997
23 01 1997
Days between: -94
글쎄, 당신은 더 간단한 방법으로 그것을 할 수 있습니다 :
public static long betweenDates(Date firstDate, Date secondDate) throws IOException
{
return ChronoUnit.DAYS.between(firstDate.toInstant(), secondDate.toInstant());
}
답변
일광 절약 시간이 다가 왔을 때 대부분 / 모든 답변에서 문제가 발생했습니다. JodaTime을 사용하지 않고 모든 날짜에 대한 작업 솔루션은 다음과 같습니다. 달력 객체를 사용합니다.
public static int daysBetween(Calendar day1, Calendar day2){
Calendar dayOne = (Calendar) day1.clone(),
dayTwo = (Calendar) day2.clone();
if (dayOne.get(Calendar.YEAR) == dayTwo.get(Calendar.YEAR)) {
return Math.abs(dayOne.get(Calendar.DAY_OF_YEAR) - dayTwo.get(Calendar.DAY_OF_YEAR));
} else {
if (dayTwo.get(Calendar.YEAR) > dayOne.get(Calendar.YEAR)) {
//swap them
Calendar temp = dayOne;
dayOne = dayTwo;
dayTwo = temp;
}
int extraDays = 0;
int dayOneOriginalYearDays = dayOne.get(Calendar.DAY_OF_YEAR);
while (dayOne.get(Calendar.YEAR) > dayTwo.get(Calendar.YEAR)) {
dayOne.add(Calendar.YEAR, -1);
// getActualMaximum() important for leap years
extraDays += dayOne.getActualMaximum(Calendar.DAY_OF_YEAR);
}
return extraDays - dayTwo.get(Calendar.DAY_OF_YEAR) + dayOneOriginalYearDays ;
}
}
답변
가장 좋은 방법은 보너스로 문자열로 변환합니다.)
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
//Dates to compare
String CurrentDate= "09/24/2015";
String FinalDate= "09/26/2015";
Date date1;
Date date2;
SimpleDateFormat dates = new SimpleDateFormat("MM/dd/yyyy");
//Setting dates
date1 = dates.parse(CurrentDate);
date2 = dates.parse(FinalDate);
//Comparing dates
long difference = Math.abs(date1.getTime() - date2.getTime());
long differenceDates = difference / (24 * 60 * 60 * 1000);
//Convert long to String
String dayDifference = Long.toString(differenceDates);
Log.e("HERE","HERE: " + dayDifference);
}
catch (Exception exception) {
Log.e("DIDN'T WORK", "exception " + exception);
}
}
답변
사용하다:
public int getDifferenceDays(Date d1, Date d2) {
int daysdiff = 0;
long diff = d2.getTime() - d1.getTime();
long diffDays = diff / (24 * 60 * 60 * 1000) + 1;
daysdiff = (int) diffDays;
return daysdiff;
}
답변
Java 날짜 라이브러리가 손상되었습니다. Joda Time 을 사용하는 것이 좋습니다 . 윤년, 시간대 등을 관리합니다.
최소 작업 예 :
import java.util.Scanner;
import org.joda.time.DateTime;
import org.joda.time.Days;
import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
public class DateTestCase {
public static void main(String[] args) {
System.out.print("Insert first date: ");
Scanner s = new Scanner(System.in);
String firstdate = s.nextLine();
System.out.print("Insert second date: ");
String seconddate = s.nextLine();
// Formatter
DateTimeFormatter dateStringFormat = DateTimeFormat
.forPattern("dd MM yyyy");
DateTime firstTime = dateStringFormat.parseDateTime(firstdate);
DateTime secondTime = dateStringFormat.parseDateTime(seconddate);
int days = Days.daysBetween(new LocalDate(firstTime),
new LocalDate(secondTime)).getDays();
System.out.println("Days between the two dates " + days);
}
}