-
Notifications
You must be signed in to change notification settings - Fork 0
/
DaysDifference.java
144 lines (127 loc) · 3.85 KB
/
DaysDifference.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
package com.javamultiplex.datetime;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
/**
*
* @author Rohit Agarwal
* @category Date and Time
* @problem Number of days between two dates?
*
*/
public class DaysDifference {
public static void main(String[] args) {
Scanner input = null;
try {
input = new Scanner(System.in);
System.out.println("Enter first date in dd/MM/yyyy format :");
String first = input.next();
System.out.println("Enter second date in dd/MM/yyyy format :");
String second = input.next();
// If Date is valid, converting String to date.
Date mydate1 = getValidDate(first);
Date mydate2 = getValidDate(second);
if (mydate1 != null && mydate2 != null) {
/*
* Calculation for Date 1 We have to convert Milliseconds to
* Days. Step by step we are converting.
*/
long millisecondsInDate1 = mydate1.getTime();
// Converting milliseconds to seconds.
double secondsInDate1 = getSeconds(millisecondsInDate1);
// Converting seconds to minutes.
double minutesInDate1 = getMinutes(secondsInDate1);
// Converting minutes to hours.
double hourInDate1 = getHours(minutesInDate1);
// Converting hours to days.
double daysInDate1 = getDays(hourInDate1);
/*
* Calculation for Date 2 We have to convert Milliseconds to
* Days. Step by step we are converting.
*/
long millisecondsInDate2 = mydate2.getTime();
// Converting milliseconds to seconds.
double secondsInDate2 = getSeconds(millisecondsInDate2);
// Converting seconds to minutes.
double minutesInDate2 = getMinutes(secondsInDate2);
// Converting minutes to hours.
double hourInDate2 = getHours(minutesInDate2);
// Converting hours to days.
double daysInDate2 = getDays(hourInDate2);
int daysDiff = (int) Math.ceil(Math.abs(daysInDate1 - daysInDate2));
System.out.println("Duration between 2 dates : " + daysDiff
+ " days");
System.out
.println("Duration between 2 dates (including end date) : "
+ (daysDiff + 1) + " days");
} else {
System.out.println("Dates are invalid.");
}
} finally {
if (input != null) {
input.close();
}
}
}
//1 Second=1000 Milliseconds
private static double getSeconds(long ms) {
double seconds = (double) ms / 1000;
return seconds;
}
//1 Minute=60 Seconds
private static double getMinutes(double s) {
double minutes = s / 60;
return minutes;
}
//1 Hour=60 Minutes
private static double getHours(double m) {
double hours = m / 60;
return hours;
}
//1 Day=24 Hours
private static double getDays(double h) {
double days = h / 24;
return days;
}
private static Date getValidDate(String date) {
Date mydate = null;
if (isValidDateFormat(date)) {
/*
* d -> Day of month
* M -> Month of year
* y -> Year
*/
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
/*
* By default setLenient() is true. We should make it false for
* strict date validations.
*
* If setLenient() is true - It accepts all dates. If setLenient()
* is false - It accepts only valid dates.
*/
dateFormat.setLenient(false);
try {
mydate = dateFormat.parse(date);
} catch (ParseException e) {
mydate = null;
}
}
return mydate;
}
private static boolean isValidDateFormat(String date) {
/*
* Regular Expression that matches String with format dd/MM/yyyy.
* dd -> 01-31
* MM -> 01-12
* yyyy -> 4 digit number
*/
String pattern = "(0?[1-9]|[12][0-9]|3[01])\\/(0?[1-9]|1[0-2])\\/([0-9]{4})";
boolean result = false;
if (date.matches(pattern)) {
result = true;
}
return result;
}
}