как найти разницу между датами в текстовом представлении и показать количество дней в каком-то другом тексте [дубликат]

вывод нескольких строк в консоль окон бесполезен. Он просто добавляет к нему пустые строки. К сожалению, путь относится к конкретным окнам и включает в себя либо conio.h (и clrscr () может не существовать, это тоже не стандартный заголовок), либо метод Win API

  #include & lt; windows.h & gt;  void ClearScreen () {HANDLE hStdOut;  CONSOLE_SCREEN_BUFFER_INFO csbi;  DWORD count;  DWORD cellCount;  COORD homeCoords = {0, 0};  hStdOut = GetStdHandle (STD_OUTPUT_HANDLE);  if (hStdOut == INVALID_HANDLE_VALUE) return;  / * Получить количество ячеек в текущем буфере * / if (! GetConsoleScreenBufferInfo (hStdOut, & amp; csbi)) return;  cellCount = csbi.dwSize.X * csbi.dwSize.Y;  / * Заполните весь буфер пробелами * / if (! FillConsoleOutputCharacter (hStdOut, (TCHAR) '', cellCount, homeCoords, & amp; count)) return;  / * Заполните весь буфер текущими цветами и атрибутами * / if (! FillConsoleOutputAttribute (hStdOut, csbi.wAttributes, cellCount, homeCoords, & amp; count)) return;  / * Переместить курсор домой * / SetConsoleCursorPosition (hStdOut, homeCoords);  }  

Для системы POSIX это проще, вы можете использовать ncurses или терминальные функции

  #include & lt; unistd.h & gt;  #include & lt; term.h & gt;  void ClearScreen () {if (! cur_term) {int result;  setupterm (NULL, STDOUT_FILENO, & amp; result);  if (result & lt; = 0) return;  } putp (tigetstr («clear»));  }  
24
задан Manitoba 27 April 2014 в 14:05
поделиться

11 ответов

Пожалуйста, обратитесь к этому коду, это может вам помочь.

public String getCountOfDays(String createdDateString, String expireDateString) {
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy", Locale.getDefault());

    Date createdConvertedDate = null, expireCovertedDate = null, todayWithZeroTime = null;
    try {
        createdConvertedDate = dateFormat.parse(createdDateString);
        expireCovertedDate = dateFormat.parse(expireDateString);

        Date today = new Date();

        todayWithZeroTime = dateFormat.parse(dateFormat.format(today));
    } catch (ParseException e) {
        e.printStackTrace();
    }

    int cYear = 0, cMonth = 0, cDay = 0;

    if (createdConvertedDate.after(todayWithZeroTime)) {
        Calendar cCal = Calendar.getInstance();
        cCal.setTime(createdConvertedDate);
        cYear = cCal.get(Calendar.YEAR);
        cMonth = cCal.get(Calendar.MONTH);
        cDay = cCal.get(Calendar.DAY_OF_MONTH);

    } else {
        Calendar cCal = Calendar.getInstance();
        cCal.setTime(todayWithZeroTime);
        cYear = cCal.get(Calendar.YEAR);
        cMonth = cCal.get(Calendar.MONTH);
        cDay = cCal.get(Calendar.DAY_OF_MONTH);
    }


    /*Calendar todayCal = Calendar.getInstance();
    int todayYear = todayCal.get(Calendar.YEAR);
    int today = todayCal.get(Calendar.MONTH);
    int todayDay = todayCal.get(Calendar.DAY_OF_MONTH);
    */

    Calendar eCal = Calendar.getInstance();
    eCal.setTime(expireCovertedDate);

    int eYear = eCal.get(Calendar.YEAR);
    int eMonth = eCal.get(Calendar.MONTH);
    int eDay = eCal.get(Calendar.DAY_OF_MONTH);

    Calendar date1 = Calendar.getInstance();
    Calendar date2 = Calendar.getInstance();

    date1.clear();
    date1.set(cYear, cMonth, cDay);
    date2.clear();
    date2.set(eYear, eMonth, eDay);

    long diff = date2.getTimeInMillis() - date1.getTimeInMillis();

    float dayCount = (float) diff / (24 * 60 * 60 * 1000);

    return ("" + (int) dayCount + " Days");
}
15
ответ дан Khalid Taha 17 August 2018 в 10:26
поделиться
  • 1
    Привет, спасибо, ошибка, которая не будет работать, если date1 указывает на ту же дату, что и date2 – Manitoba 27 April 2014 в 14:58
  • 2
    Именно то, что я искал. Благодаря! long diff = date2.getTimeInMillis() - date1.getTimeInMillis(); float dayCount = (float) diff / (24 * 60 * 60 * 1000); – Bram 3 January 2015 в 19:45
  • 3
    Но это может быть фальсифицировано, если пользователь вручную меняет дату устройства ... как это обходиться? – statosdotcom 17 April 2017 в 06:17

наилучшим образом: -

        long fromCalender = Calender.getInstance();
        fromCalender.set...// set the from dates
        long toCalender = Calender.getInstance();
        fromCalender.set...// set the to dates

        long diffmili = fromCalender - toCalender;

        long hours = TimeUnit.MILLISECONDS.toHours(diffmili);
        long days = TimeUnit.MILLISECONDS.toDays(diffmili);
        long min = TimeUnit.MILLISECONDS.toMinutes(diffmili);
        long sec = TimeUnit.MILLISECONDS.toSeconds(diffmili);
3
ответ дан Akshay Paliwal 17 August 2018 в 10:26
поделиться

это стандартный и лучший способ:

SimpleDateFormat myFormat = new SimpleDateFormat("dd/MM/yyyy");

                        try {
                            java.util.Date date1 = myFormat.parse(date1);     //for example 1/1/2017
                            java.util.Date date2 = myFormat.parse(date2);     //for example 5/1/2017
                            long diff = date2.getTime() - date1.getTime();

                            System.out.println ("Days: " + TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS)); // Days : 5


                        } catch (ParseException e) {
                            e.printStackTrace();
                        }
0
ответ дан erfan 17 August 2018 в 10:26
поделиться

Наконец-то я нашел самый простой способ справиться с этим. Вот мой код:

public int getTimeRemaining()
{
    Calendar sDate = toCalendar(this.dateEvent);
    Calendar eDate = toCalendar(System.currentTimeMillis());

    // Get the represented date in milliseconds
    long milis1 = sDate.getTimeInMillis();
    long milis2 = eDate.getTimeInMillis();

    // Calculate difference in milliseconds
    long diff = Math.abs(milis2 - milis1);

    return (int)(diff / (24 * 60 * 60 * 1000));
}

private Calendar toCalendar(long timestamp)
{
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(timestamp);
    calendar.set(Calendar.HOUR_OF_DAY, 0);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);
    calendar.set(Calendar.MILLISECOND, 0);
    return calendar;
}

Надеюсь, это поможет.

8
ответ дан hrules6872 17 August 2018 в 10:26
поделиться
  • 1
    Это сработало для меня после того, как я изменил Calendar.HOUR на Calendar.HOUR_OF_DAY – ePeace 18 December 2015 в 10:19
public long Daybetween(String date1,String date2,String pattern)
{
    SimpleDateFormat sdf = new SimpleDateFormat(pattern,Locale.ENGLISH);
    Date Date1 = null,Date2 = null;
    try{
        Date1 = sdf.parse(date1);
        Date2 = sdf.parse(date2);
    }catch(Exception e)
    {
        e.printStackTrace();
    }
    return (Date2.getTime() - Date1.getTime())/(24*60*60*1000);
}
2
ответ дан indrajeet 17 August 2018 в 10:26
поделиться
    Date userDob = new SimpleDateFormat("yyyy-MM-dd").parse(dob);
    Date today = new Date();
    long diff =  today.getTime() - userDob.getTime();
    int numOfYear = (int) ((diff / (1000 * 60 * 60 * 24))/365);
    int numOfDays = (int) (diff / (1000 * 60 * 60 * 24));
    int hours = (int) (diff / (1000 * 60 * 60));
    int minutes = (int) (diff / (1000 * 60));
    int seconds = (int) (diff / (1000));
4
ответ дан Nilesh Savaliya 17 August 2018 в 10:26
поделиться

Вы никогда не должны использовать формулу 24 * 60 * 60 * 1000! Зачем? Потому что есть дневная экономия времени, и не все дни имеют 24 часа, а также о високосном году, который имеет +1 день. Вот почему есть класс календаря. Если вы не хотите размещать внешнюю библиотеку в своем проекте, например Jodatime, вы можете использовать класс pure Calendar с очень эффективной функцией:

public static int numDaysBetween(final Calendar c, final long fromTime, final long toTime) {
    int result = 0;
    if (toTime <= fromTime) return result;

    c.setTimeInMillis(toTime);
    final int toYear = c.get(Calendar.YEAR);
    result += c.get(Calendar.DAY_OF_YEAR);

    c.setTimeInMillis(fromTime);
    result -= c.get(Calendar.DAY_OF_YEAR);

    while (c.get(Calendar.YEAR) < toYear) {
        result += c.getActualMaximum(Calendar.DAY_OF_YEAR);
        c.add(Calendar.YEAR, 1);
    }

    return result;
}
1
ответ дан Oleksandr Albul 17 August 2018 в 10:26
поделиться

Лучшее решение, которое сработало для меня, это:

private static int findDaysDiff(long unixStartTime,long unixEndTime)
    {
        Calendar calendar1 = Calendar.getInstance();
        calendar1.setTimeInMillis(unixStartTime);
        calendar1.set(Calendar.HOUR_OF_DAY, 0);
        calendar1.set(Calendar.MINUTE, 0);
        calendar1.set(Calendar.SECOND, 0);
        calendar1.set(Calendar.MILLISECOND, 0);

        Calendar calendar2 = Calendar.getInstance();
        calendar2.setTimeInMillis(unixEndTime);
        calendar2.set(Calendar.HOUR_OF_DAY, 0);
        calendar2.set(Calendar.MINUTE, 0);
        calendar2.set(Calendar.SECOND, 0);
        calendar2.set(Calendar.MILLISECOND, 0);

        return (int) ((calendar2.getTimeInMillis()-calendar1.getTimeInMillis())/(24 * 60 * 60 * 1000));

    }

Поскольку он сначала преобразует Hour, Minute, Second и Millisecond в 0, и теперь разница будет быть только в днях.

1
ответ дан Pradeep Kumar Kushwaha 17 August 2018 в 10:26
поделиться

Сделайте так, чтобы он поддерживал все уровни Api

    Calendar cal = Calendar.getInstance();
    SimpleDateFormat sdf = new SimpleDateFormat("MMM dd yyyy HH:mm:ss", 
    Locale.ENGLISH);
    try {
        String datestart="June 14 2018 16:02:37";
        cal.setTime(sdf.parse(datestart));// all done
         Calendar cal1=Calendar.getInstance();
        String formatted = sdf.format(cal1.getTime());//formatted date as i want
        cal1.setTime(sdf.parse(formatted));// all done

        long msDiff = cal1.getTimeInMillis() - cal.getTimeInMillis();
        long daysDiff = TimeUnit.MILLISECONDS.toDays(msDiff);
        Toast.makeText(this, "days="+daysDiff, Toast.LENGTH_SHORT).show();
    } catch (ParseException e) {
        e.printStackTrace();
    }
1
ответ дан Syed Danish Haider 17 August 2018 в 10:26
поделиться

Вот двухлинейное решение:

long msDiff = Calendar.getInstance().getTimeInMillis() - testCalendar.getTimeInMillis();
long daysDiff = TimeUnit.MILLISECONDS.toDays(msDiff);

В этом примере он получает количество дней между датой «testCalendar» и текущей датой.

71
ответ дан The Berga 17 August 2018 в 10:26
поделиться
  • 1
    Ах, именно то, что я искал. Благодаря! – Tobias Reich 31 May 2017 в 16:22

У меня была такая же потребность, я, наконец, закончил использование Joda Time, это очень удобно и предлагает множество дополнительных функций, включая тот, который вы ищете.

Вы можете загрузить файлы из здесь .

После того, как вы включили файл jar в свой проект, вы можете легко сделать, например, следующее:

int daysBetween = Days.daysBetween(new DateTime(sDate), new DateTime(eDate)).getDays();
1
ответ дан Yoann Hercouet 17 August 2018 в 10:26
поделиться
  • 1
    Библиотека времени Joda добавит к вашему проекту 4744 метода. Выбирайте разумно, если хотите избежать ограничения 65K методов. – Lior Iluz 22 December 2015 в 16:56
  • 2
    Добавление банок действительно неразумно, просто для простого вычисления. Будьте осторожны с ограничениями методов, о которых упоминал @LiorIluz. – sud007 13 January 2016 в 13:24
Другие вопросы по тегам:

Похожие вопросы: