Единственная модификация, которую вам нужно сделать - это вернуть данные из 1-й функции, которая требуется для 2-й функции. Шаговая функция автоматически получит выход первой функции в качестве входа 2-й функции.
Кроме того, вам не нужно обрабатывать вызовы функций между лямбда-функциями, конечный автомат будет обрабатывать это.
Кроме того, за услугу не будет взиматься дополнительная плата, кроме стоимости лямбда-выполнения, поэтому ваши затраты остаются такими же.
My standard advice for Java date/time questions: don't use java.util.{Calendar,Date}
. Use Joda Time. That way you can represent a date as a date (with no associated time zone), instead of a date/time. Or you could use a DateMidnight
if that's what you want to represent. (Be careful of combinations of time zone and date where there is no midnight though...)
What do you need to use the Date
with? If you can get away with changing to use Joda throughout, that's great. Otherwise, you can use Joda to do what you want and then convert to milliseconds (and then to java.util.Date
) when you really need to.
(Michael's solution when using Date
/Calendar
is fine if you really want to stick within a broken API... but I can't overstate how much better Joda is...)
I use this:
public static Date startOfDay(Date date) {
Calendar dCal = Calendar.getInstance();
dCal.setTime(date);
dCal.set(Calendar.HOUR_OF_DAY, 0);
dCal.set(Calendar.MINUTE, 0);
dCal.set(Calendar.SECOND, 0);
dCal.set(Calendar.MILLISECOND, 0);
return dCal.getTime();
}
Вы должны использовать HOUR_OF_DAY вместо ] HOUR и объедините его с MINUTE и SECOND.
import java.util.Calendar;
import static java.util.Calendar.HOUR_OF_DAY;
import static java.util.Calendar.MINUTE;
import static java.util.Calendar.SECOND;
import static java.util.Calendar.MILLISECOND;
public class Today {
public static void main( String [] args ) {
Calendar cal = Calendar.getInstance();
cal.set( HOUR_OF_DAY, 0 );
cal.set( MINUTE, 0 );
cal.set( SECOND, 0 );
cal.set( MILLISECOND, 0 );
System.out.println( cal.getTime() );
}
}
Полученные вами результаты обусловлены тем, что HOUR используется для AM / PM, а HOUR_OF_DAY - 24 часа.
HOUR_OF_DAY:
Номер поля для получения и установки с указанием часа дня. HOUR_OF_DAY используется для 24-часовых часов. Например, в 10: 04: 15.250 PM HOUR_OF_DAY равен 22.
HOUR:
Номер поля для получения и установки, указывающий час утра или дня. ЧАС используется для 12-часовых часов (0 - 11). Полдень и полночь представлены 0, а не 12. Например, в 10: 04: 15.250 PM ЧАС - 10.
The time component is not just hours (and Calendar.HOUR is, as you have noticed, AM/PM). You need to set all of the time fields to 0: HOUR_OF_DAY, MINUTE, SECOND, MILLISECOND.
Another vote for JodaTime.
java.util.Date and Calendar are so bad they are broken. (And SimpleDateFormat is rubbish too!)
For what it's worth, Java 7 will include a new date time library based strongly around JodaTime.
Why the string manipulation?
Can you not just set the values you need on the Calendar object before converting to a Date using getTime()?
Как упоминалось выше, вы должны использовать
Calendar.HOUR_OF_DAY
В отличие от
Calendar.HOUR
Также вам нужно очистить другие поля ( Calendar.MINUTE
, Calendar.SECOND
и Calendar.MILLISECOND
), установив их в ноль.
К сожалению, здесь нет простого способа. Боль, и именно поэтому они работают над новым API для Java 7, который, я считаю, основан на Joda Time.
... или вы можете сделать это хакерским способом:
long MS_PER_DAY = 86400000L;
Date dateTime=new Date();
long offset = TimeZone.getDefault().getOffset(dateTime.getTime());
Date date= new Date(((dateTime.getTime()+offset)/MS_PER_DAY)*MS_PER_DAY-offset);