как Visual FoxPro обрабатывает расчет даты? (исходя из java) результат для операции date()-day(date())+1?

каково правильное значение формулы date()-day(date())+1?

если date() возвращает «2016/5/5»

is it, 2016/5/1? or 2016/4/29?

потому что при конвертации кода из visual foxpro в java?

следующий код дает другой результат.

Calendar today2 = Calendar.getInstance();   

Calendar endDate = Calendar.getInstance();
endDate.add(Calendar.DATE, -1 * today2.get(Calendar.DATE)); 
endDate.add(Calendar.DATE, 1);  

приведенный выше код создает 2016/5/1, а:

Calendar today2 = Calendar.getInstance();   
today2.add(Calendar.DATE, 1);   

Calendar endDate = Calendar.getInstance();
endDate.add(Calendar.DATE, -1 * today2.get(Calendar.DATE)); 

выше код производит 2016/4/29.

не уверен, какое преобразование является правильным?


person vims liu    schedule 09.07.2016    source источник


Ответы (1)


Собственно очевидно и 2016/5/1. Математика проста:

date() - day(date()) будет 2016/5/5 - 5 дней, то есть 2016/4/30 (theDate - day(theDate) дает последний день предыдущего месяца, добавление 1 дает первый день месяца, который theDate в). Добавление 1 дня к нему означает 2016/5/1.

Я не знаю Java, но для меня ваш второй код Java неверен.

В первом вы вычитаете день месяца, а затем добавляете 1 (так же, как это делает VFP).

Во втором вы устанавливаете сегодня2 на «завтра», а затем вычитаете завтрашний день месяца из сегодняшней даты. Это будет означать date() - (day(date()+1)) и вы получите день до даты окончания прошлого месяца.

Обновление: я думаю, вы можете упростить свой код как:

Calendar today = Calendar.getInstance();   
today.add(Calendar.DATE, 1 - today2.get(Calendar.DATE)); 

IOW код VFP, чтобы найти начало месяца:

firstDayOfMonth = theDate - day(theDate) + 1

следует перевести на:

Calendar firstDayOfMonth = Calendar.getInstance();
firstDayOfMonth.add(Calendar.DATE, 1 - firstDayOfMonth.get(Calendar.DATE));
person Cetin Basoz    schedule 09.07.2016
comment
@vimsliu, хотя Цетин предлагает подробные разъяснения в своем ответе, будьте осторожны, если вы действительно имеете дело с полем даты/времени. Если это так, то добавление числа, например 1, на самом деле является секундами в поле даты/времени, поэтому добавление 1 минуты будет +60. 1 час будет 60 * 60. Но вы хотели по дате, и я просто хотел уточнить, ЕСЛИ вы имеете дело с полем даты/времени. - person DRapp; 13.07.2016
comment
В случае DateTime начало месяца будет таким же, вы приведете его к дате, а математика останется прежней :) cast(theDateTime as Date) - day(theDateTime) +1. - person Cetin Basoz; 13.07.2016