我正在使用 GregorianCalander,当我尝试使用以下代码获取今天的日期时,我得到的日期可以追溯到一个月。我使用的代码如下。
Calendar gcal = new GregorianCalendar();
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
today = getTime(gcal);
//date = dateFormat.format(calendar.getTime());
System.out.println("Today: " + today);
请帮我解决这个问题。
输出是:
今天:4 月 28 日星期四 00:00:00 NZST 2011
编辑
private Date getTime(Calendar gcal) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
String day = form_helper.round(gcal.get(GregorianCalendar.DAY_OF_MONTH));
String month = form_helper.round(gcal.get(GregorianCalendar.MONTH));
String year = form_helper.round(gcal.get(GregorianCalendar.YEAR));
String date = day + "/" + month + "/" + year;
System.out.println(sdf.parse(date));
return sdf.parse(date);
} catch (ParseException ex) {
Logger.getLogger(timesheet_utility.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
我认为月份的内部编号从 0 开始,而不是 1。所以,您可能需要在某个地方添加 +1。
编辑:在显示更多代码后:需要的更改是
String month = form_helper.round(gcal.get(GregorianCalendar.MONTH) + 1);
getTime()
方法有什么作用?请记住,在 Java 中,月份常量从 0 开始,而不是从 1 开始,所以 Calendar.JANUARY == 0
。
编辑
自从您发布了
getTime()
的代码以来,我认为这就是问题所在:
gcal.get(GregorianCalendar.MONTH)
返回 Java 内部存储的月份值,即 0 索引的月份值,因此“May”的值实际上是整数“4”。
当值“4”被放回日期解析器时,结果是“四月”,因为解析器像人类一样解释日期。因此,您只需将此值加 1 即可确保解析正确进行。
如果您想要一个代表今天 12:00AM(或 00:00)的
Date
对象,为什么不这样做:
private Date getTime() {
Calendar gcal = new GregorianCalendar();
gcal.set(Calendar.HOUR_OF_DAY, 0);
gcal.set(Calendar.MINUTE, 0);
gcal.set(Calendar.SECOND, 0);
gcal.set(Calender.MILLISECOND, 0);
return gcal.getTime();
}
这是我的尝试:
package forums;
import java.util.Date;
import java.util.Calendar;
import java.util.GregorianCalendar;
public class Deepak
{
public static void main(String[] args) {
try {
(new Deepak()).run();
} catch (Exception e) {
e.printStackTrace();
}
}
public void run() {
Calendar calendar = new GregorianCalendar();
Date today = calendar.getTime();
System.out.println("Today: " + today);
}
}
输出是预期的:
Today: Sat May 28 22:00:52 EST 2011
存在严重缺陷的
Calendar
和 GregorianCalendar
类现在已成为遗留物,多年前已被 JSR 310 中定义的现代 java.time 类取代。
LocalDate
LocalDate
类。
要捕获当前日期,请指定时区。对于任何给定时刻,全球各地的日期因时区而异。它可以是日本东京的“明天”,同时也可以是美国俄亥俄州托莱多的“昨天”。
ZoneId z = ZoneId.of( "America/Edmonton" ) ; // Or `ZoneId.systemDefault`.
LocalDate today = LocalDate.now( z ) ;