我在Java中遇到以下问题(我看到有些人正在使用 JavaScript中的类似问题,但我使用的是Java)
System.out.println(new Date().getYear());
System.out.println(new GregorianCalendar().getTime().getYear());
System.out.println(this.sale.getSaleDate().getYear());
System.out.println(this.sale.getSaleDate().getMonth());
System.out.println(this.sale.getSaleDate().getDate());
返回
I/System.out( 4274): 112
I/System.out( 4274): 112
I/System.out( 4274): 112
I/System.out( 4274): 1
I/System.out( 4274): 11
我不理解我认为2012年的112位。
发生了什么事?是个
java.util.Date
类无法使用?我将它存储为几个字段
我的课程存储日期和时间。我该怎么办?
答案 0 :(得分:57)
除了所有评论之外,我想我可能会根据javadoc添加一些关于如何使用java.util.Date,java.util.Calendar和java.util.GregorianCalendar的代码。
//Initialize your Date however you like it.
Date date = new Date();
Calendar calendar = new GregorianCalendar();
calendar.setTime(date);
int year = calendar.get(Calendar.YEAR);
//Add one to month {0 - 11}
int month = calendar.get(Calendar.MONTH) + 1;
int day = calendar.get(Calendar.DAY_OF_MONTH);
答案 1 :(得分:52)
根据javadocs:
@Deprecated
public int getYear()
<强>已过时即可。从JDK 1.1版开始,由Calendar.get(Calendar.YEAR) - 1900
替换。
返回一个值,该值是从包含或以此Date对象表示的时间开始的年份减去1900的结果,如本地时区中所解释的那样。
<强>返回:强> 这个日期所代表的年份,减去1900年。
另见: Calendar
所以112是正确的输出。我会遵循Javadoc中的建议或改为使用JodaTime。
答案 2 :(得分:31)
使用日期格式
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = format.parse(datetime);
SimpleDateFormat df = new SimpleDateFormat("yyyy");
year = df.format(date);
答案 3 :(得分:21)
请勿使用Date
,请使用Calendar
:
// Beware: months are zero-based and no out of range errors are reported
Calendar date = new GregorianCalendar(2012, 9, 5);
int year = date.get(Calendar.YEAR); // 2012
int month = date.get(Calendar.MONTH); // 9 - October!!!
int day = date.get(Calendar.DAY_OF_MONTH); // 5
它也支持时间:
Calendar dateTime = new GregorianCalendar(2012, 3, 4, 15, 16, 17);
int hour = dateTime.get(Calendar.HOUR_OF_DAY); // 15
int minute = dateTime.get(Calendar.MINUTE); // 16
int second = dateTime.get(Calendar.SECOND); // 17
答案 4 :(得分:10)
Returns: the year represented by this date, minus 1900.
出于这个原因,不推荐使用getYear方法。所以,不要使用它。
另请注意,getMonth返回0到11之间的数字。因此,this.sale.getSaleDate().getMonth()
返回2表示1,而不是2.虽然java.util.Calendar
并未向所有年份添加1900,但它确实遭受一个月之外的问题。
使用JodaTime,你会好得多。
答案 5 :(得分:8)
Java 8 LocalDate类是另一个从java.util.Date获取年份的选项,
int year = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(date)).getYear();
另一种选择是,
int year = Integer.parseInt(new SimpleDateFormat("yyyy").format(date));
答案 6 :(得分:7)
java文档建议使用Calendar类而不是这种不赞成使用的方式 以下是设置日历对象的示例代码
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
以下是获取年,月等的示例代码
System.out.println(calendar.get(Calendar.YEAR));
System.out.println(calendar.get(Calendar.MONTH));
日历还支持许多其他有用信息,例如TIME,DAY_OF_MONTH等。此处documentation列出所有这些信息 请注意,月份为0。 1月是第0个月。
答案 7 :(得分:4)
LocalDate.now() // Capture the date-only value current in the JVM’s current default time zone.
.getYear() // Extract the year number from that date.
2018
java.util.Date
和java.util.Calendar
类都是遗留的,现在由Java 8及更高版本中内置的java.time框架取代。
时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。
如果未指定时区,则JVM会隐式应用其当前的默认时区。该默认值可能随时更改,因此您的结果可能会有所不同。最好明确指定您期望/预期的时区作为参数。
以continent/region
的格式指定proper time zone name,例如America/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用诸如EST
或IST
之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
如果您只想要没有时间的日期,请使用LocalDate
。此类缺少时区信息,但您可以指定时区来确定当前日期。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate localDate = LocalDate.now( zoneId );
您可以使用getYear
,getMonth
和getDayOfMonth
获取各种信息。实际上,您将使用java.time获取年份编号!
int year = localDate.getYear();
2016
如果您想要日期时间而不仅仅是日期,请使用ZonedDateTime
类。
ZonedDateTime zdt = ZonedDateTime.now( zoneId ) ;
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧日期时间类,例如java.util.Date
,.Calendar
和&amp; java.text.SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。
许多 java.time 功能都被反向移植到Java 6&amp; ThreeTen-Backport中的Java 7并进一步适应Android中的ThreeTenABP(参见How to use…)。
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
答案 8 :(得分:1)
java.util.Date - 类文档中记录了此行为:
返回一个值,该值是从年份中减去1900的结果 包含或以此为代表的时刻开始 日期对象,在本地时区中解释。
它也被标记为已弃用。请改用java.util.Calendar。
答案 9 :(得分:1)
有几种方法可以获取java中的日,月和年。
您可以使用任何-
Date date1 = new Date();
String mmddyyyy1 = new SimpleDateFormat("MM-dd-yyyy").format(date1);
System.out.println("Formatted Date 1: " + mmddyyyy1);
Date date2 = new Date();
Calendar calendar1 = new GregorianCalendar();
calendar1.setTime(date2);
int day1 = calendar1.get(Calendar.DAY_OF_MONTH);
int month1 = calendar1.get(Calendar.MONTH) + 1; // {0 - 11}
int year1 = calendar1.get(Calendar.YEAR);
String mmddyyyy2 = ((month1<10)?"0"+month1:month1) + "-" + ((day1<10)?"0"+day1:day1) + "-" + (year1);
System.out.println("Formatted Date 2: " + mmddyyyy2);
LocalDateTime ldt1 = LocalDateTime.now();
DateTimeFormatter format1 = DateTimeFormatter.ofPattern("MM-dd-yyyy");
String mmddyyyy3 = ldt1.format(format1);
System.out.println("Formatted Date 3: " + mmddyyyy3);
LocalDateTime ldt2 = LocalDateTime.now();
int day2 = ldt2.getDayOfMonth();
int mont2= ldt2.getMonthValue();
int year2= ldt2.getYear();
String mmddyyyy4 = ((mont2<10)?"0"+mont2:mont2) + "-" + ((day2<10)?"0"+day2:day2) + "-" + (year2);
System.out.println("Formatted Date 4: " + mmddyyyy4);
LocalDateTime ldt3 = LocalDateTime.of(2020, 6, 11, 14, 30); // int year, int month, int dayOfMonth, int hour, int minute
DateTimeFormatter format2 = DateTimeFormatter.ofPattern("MM-dd-yyyy");
String mmddyyyy5 = ldt3.format(format2);
System.out.println("Formatted Date 5: " + mmddyyyy5);
Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(new Date());
int day3 = calendar2.get(Calendar.DAY_OF_MONTH); // OR Calendar.DATE
int month3= calendar2.get(Calendar.MONTH) + 1;
int year3 = calendar2.get(Calendar.YEAR);
String mmddyyyy6 = ((month3<10)?"0"+month3:month3) + "-" + ((day3<10)?"0"+day3:day3) + "-" + (year3);
System.out.println("Formatted Date 6: " + mmddyyyy6);
Date date3 = new Date();
LocalDate ld1 = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(date3)); // Accepts only yyyy-MM-dd
int day4 = ld1.getDayOfMonth();
int month4= ld1.getMonthValue();
int year4 = ld1.getYear();
String mmddyyyy7 = ((month4<10)?"0"+month4:month4) + "-" + ((day4<10)?"0"+day4:day4) + "-" + (year4);
System.out.println("Formatted Date 7: " + mmddyyyy7);
Date date4 = new Date();
int day5 = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(date4)).getDayOfMonth();
int month5 = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(date4)).getMonthValue();
int year5 = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(date4)).getYear();
String mmddyyyy8 = ((month5<10)?"0"+month5:month5) + "-" + ((day5<10)?"0"+day5:day5) + "-" + (year5);
System.out.println("Formatted Date 8: " + mmddyyyy8);
Date date5 = new Date();
int day6 = Integer.parseInt(new SimpleDateFormat("dd").format(date5));
int month6 = Integer.parseInt(new SimpleDateFormat("MM").format(date5));
int year6 = Integer.parseInt(new SimpleDateFormat("yyyy").format(date5));
String mmddyyyy9 = ((month6<10)?"0"+month6:month6) + "-" + ((day6<10)?"0"+day6:day6) + "-" + (year6);
System.out.println("Formatted Date 9: " + mmddyyyy9);
答案 10 :(得分:0)
template "#{prefix}/sudoers" do
# <snip>
variables(
sudoers_groups: node['authorization']['sudo']['groups'],
# <snip>
)
end
大部分日期都已弃用。