用Java计算两个date之间的天数
我想要一个计算两个date之间天数的Java程序。
- 键入第一个date(德语符号;空格:“dd mm yyyy”)
- input第二个date。
- 程序应计算两个date之间的天数。
我怎样才能包括闰年和夏季?
我的代码:
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); } }
您正在使用不需要的string进行一些转换。 有一个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); }
当夏令时出现时,大部分/所有答案都会给我们带来问题。 这是我们所有date的工作解决scheme,无需使用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 ; } }
在Java 8中,您可以通过使用LocalDate
和DateTimeFormatter
来完成此操作。 从LocalDate
的Javadoc :
LocalDate是一个不可变的date – 时间对象,表示一个date,通常被视为年,日。
而模式可以使用DateTimeFormatter
构造。 这里是Javadoc和我使用的相关模式字符:
符号 – 含义 – 演示 – 例子
y – 年代 – 2004年; 04
M / L – 月份 – 数量/文本 – 7; 07; 7月; 七月; Ĵ
日 – 月 – 数 – 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); } }
最近的最后一个input/输出示例:
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()); }
Javadate库出了名的问题。 我会build议使用乔达时间 。 它会照顾你的闰年,时区等。
最小工作示例:
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); } }
String dateStart = "01/14/2015 08:29:58"; String dateStop = "01/15/2015 11:31:48"; //HH converts hour in 24 hours format (0-23), day calculation SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); Date d1 = null; Date d2 = null; d1 = format.parse(dateStart); d2 = format.parse(dateStop); //in milliseconds long diff = d2.getTime() - d1.getTime(); long diffSeconds = diff / 1000 % 60; long diffMinutes = diff / (60 * 1000) % 60; long diffHours = diff / (60 * 60 * 1000) % 24; long diffDays = diff / (24 * 60 * 60 * 1000); System.out.print(diffDays + " days, "); System.out.print(diffHours + " hours, "); System.out.print(diffMinutes + " minutes, "); System.out.print(diffSeconds + " seconds.");
使用:
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; }
最好的方法,它转换为一个string作为奖金;)
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); } }
当我运行你的程序,它甚至没有让我到我可以input第二个date的地步。
这更简单,更不容易出错。
import java.io.BufferedReader; import java.io.InputStreamReader; import java.text.SimpleDateFormat; import java.util.Date; public class Test001 { public static void main(String[] args) throws Exception { BufferedReader br = null; br = new BufferedReader(new InputStreamReader(System.in)); SimpleDateFormat sdf = new SimpleDateFormat("dd MM yyyy"); System.out.println("Insert first date : "); Date dt1 = sdf.parse(br.readLine().trim()); System.out.println("Insert second date : "); Date dt2 = sdf.parse(br.readLine().trim()); long diff = dt2.getTime() - dt1.getTime(); System.out.println("Days: " + diff / 1000L / 60L / 60L / 24L); if (br != null) { br.close(); } } }
// date format, it will be like "2015-01-01" private static final String DATE_FORMAT = "yyyy-MM-dd"; // convert a string to java.util.Date public static Date convertStringToJavaDate(String date) throws ParseException { DateFormat dataFormat = new SimpleDateFormat(DATE_FORMAT); return dataFormat.parse(date); } // plus days to a date public static Date plusJavaDays(Date date, int days) { // convert to jata-time DateTime fromDate = new DateTime(date); DateTime toDate = fromDate.plusDays(days); // convert back to java.util.Date return toDate.toDate(); } // return a list of dates between the fromDate and toDate public static List<Date> getDatesBetween(Date fromDate, Date toDate) { List<Date> dates = new ArrayList<Date>(0); Date date = fromDate; while (date.before(toDate) || date.equals(toDate)) { dates.add(date); date = plusJavaDays(date, 1); } return dates; }