У меня есть две даты 20-03-2011 и 1-04-2011, хранящиеся как String. Как я могу разобрать это в формате даты и рассчитать разницу между двумя датами?Разница между двумя конкретными датами
ответ
использование функции синтаксического анализа в java.text.DateFormat
Парсинг объясняется здесь: Parse A Java Date
и вычисляя различия здесь: https://stackoverflow.com/a/3100373/66686
Способ вычисления diff по этой ссылке замедляется - никогда не догадался, что кто-то будет использовать цикл while для DateDiff. Итак - это намного лучше, используя любой из ответов, доступных на этой странице. – kape123
Следующая одно решение, поскольку существует множество способов, которыми мы можем достичь этого:
import java.util.*;
int syear = 2000;
int eyear = 2000;
int smonth = 2;//Feb
int emonth = 3;//Mar
int sday = 27;
int eday = 1;
Date startDate = new Date(syear-1900,smonth-1,sday);
Date endDate = new Date(eyear-1900,emonth-1,eday);
int difInDays = (int) ((endDate.getTime() - startDate.getTime())/(1000*60*60*24));
Спасибо за помощь ... – rak
добро пожаловать. –
Вы можете использовать joda-time:
public void diff(String str1, String str2)
{
DateTimeFormatter FMT = DateTimeFormat.forPattern("dd-mm-yyyy");
final DateTime dt1 = new DateTime(FMT.parseDateTime(str1));
final DateTime dt2 = new DateTime(FMT.parseDateTime(str2));
Days days = Days.daysBetween(dt1, dt2);
}
Попробуйте это:
long getDateDiff(String str1, String str2) throws ParseException {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MM-yyyy");
Date date1 = simpleDateFormat.parse(str1);
Date date2 = simpleDateFormat.parse(str2);
return date2.getTime() - date1.getTime();
}
Это небольшая программа, которую я сделал на скорую руку, чтобы показать, как вы можете сделать это. Остерегайтесь, однако, он может содержать ошибки, поскольку я тестировал его только с нескольких дат примера.
Вы должны всегда тщательно протестировать любой код, содержащий расчеты даты, поскольку Java API для выполнения всего этого материала очень неуклюж, и всегда, кажется, создает багги-код. Когда это возможно, используйте более удобный интерфейс даты и времени, например JodaTime, что и используется на моем рабочем месте.
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class DateFun {
public static void main(String[] args) throws ParseException {
String dateOne = "20-03-2011 06:44:03 GMT";
String dateTwo = "25-03-2011 23:12:59 GMT";
String format = "dd-MM-yyyy HH:mm:ss z";
System.out.println(getDiff(parseDateString(format, dateTwo),
parseDateString(format, dateOne)));
dateOne = "20-03-2011 GMT";
dateTwo = "1-04-2011 GMT";
format = "dd-MM-yyyy z";
System.out.println(getDiff(parseDateString(format, dateOne),
parseDateString(format, dateTwo)));
}
private static Calendar parseDateString(final String format,
final String date) throws ParseException {
final Date parsed = new SimpleDateFormat(format).parse(date);
final Calendar cal = Calendar.getInstance();
cal.setTime(parsed);
return cal;
}
private static TimeDiff getDiff(final Calendar calOne, final Calendar calTwo) {
return new TimeDiff(Math.abs(calOne.getTimeInMillis() - calTwo.getTimeInMillis()));
}
private static class TimeDiff {
private static final long MS_IN_SECOND = 1000;
private static final long MS_IN_MINUTE = MS_IN_SECOND * 60;
private static final long MS_IN_HOUR = MS_IN_MINUTE * 60;
private static final long MS_IN_DAY = MS_IN_HOUR * 24;
private final long days;
private final long hours;
private final long minutes;
private final long seconds;
private final long milliseconds;
TimeDiff(final long msDiff) {
long msRemainder = msDiff;
days = msRemainder/MS_IN_DAY;
msRemainder = msRemainder - (days * MS_IN_DAY);
hours = msRemainder/MS_IN_HOUR;
msRemainder = msRemainder - (hours * MS_IN_HOUR);
minutes = msRemainder/MS_IN_MINUTE;
msRemainder = msRemainder - (minutes * MS_IN_MINUTE);
seconds = msRemainder/MS_IN_SECOND;
msRemainder = msRemainder - (seconds * MS_IN_SECOND);
milliseconds = msRemainder;
}
@Override
public String toString() {
return "TimeDiff[days: " + days + ", hours: " +
hours + ", minutes: " + minutes +
", seconds: " + seconds + ", milliseconds: " +
milliseconds + "]";
}
}
}
Если кто-то видит ошибку в этом, дайте мне знать.
Пожалуйста, попробуйте ниже код:
public void compareDate(String date1, String date2){
SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy");
Calendar calendar1 = Calendar.getInstance();
Calendar calendar2 = Calendar.getInstance();
calendar1.setTime(format.parse(date1));
calendar2.setTime(format.parse(date2));
long milliseconds1 = calendar1.getTimeInMillis();
long milliseconds2 = calendar2.getTimeInMillis();
long diff = milliseconds2 - milliseconds1;
long diffSeconds = diff/1000;
long diffMinutes = diff/(60 * 1000);
long diffHours = diff/(60 * 60 * 1000);
long diffDays = diff/(24 * 60 * 60 * 1000);
System.out.println("\nThe Date Different Example");
System.out.println("Time in milliseconds: " + diff+ " milliseconds.");
System.out.println("Time in seconds: " + diffSeconds+ " seconds.");
System.out.println("Time in minutes: " + diffMinutes + " minutes.");
System.out.println("Time in hours: " + diffHours + " hours.");
System.out.println("Time in days: " + diffDays + " days.");
}
Прежде всего, необходимо разобрать их 'date' (поиск' SimpleDateFormat' на SO) и просто вычесть 'Date.getTime()'. Результат - в миллисекундах. –
@TomaszNurkiewicz – rak
@TomaszNurkiewicz Я пробовал приведенный ниже код, но показывает ошибку как непревзойденную дату.DateFormat formatter; \t \t \t \t \t \t \t \t \t \t Дата date1; \t \t \t \t \t \t \t \t \t \t Дата date2; \t \t \t \t \t \t \t \t \t \t форматировщик = новый SimpleDateFormat ("дд/МММ/гг"); \t \t \t \t \t \t \t \t \t \t попробовать { \t \t \t \t \t \t \t \t \t \t \t date1 = (дата) форматировщик.синтаксический анализ (LeaveStartDate); \t \t \t \t \t \t \t \t \t \t \t System.out.println ("date1 --------" + date1); \t \t \t \t \t \t \t \t \t \t} задвижка (ParseException е) {\t \t \t \t \t \t \t \t \t \t \t // TODO автоматическая генерация улова блока \t \t \t \t \t \t \t \t \t \t \t e.printStackTrace(); \t \t \t \t \t \t \t \t \t \t – rak