如何使用YYYY-MM-DD格式初始化公历日历?
我有一个包含变量的类
private GregorianCalendar cal;
现在我想用yyyy-mm-dd
格式的日期初始化它,我尝试使用默认构造函数,但我得到的输出是这样的"2017-05-25T14:36:52+03:00"
,我只想要"2017-05-25"
日期部分?
我该如何实现?
首先,你可能讨厌重申,你需要明白日期与该日期的字符串表示之间存在差异; 基础数据与其字符串表示之间的差异。
其次,如果需要, 可以将LocalDate
(以及其他Java日期和时间类)与Java 7一起使用。 它是(并且它们都是) ThreeTen-Backport ,Java SE 8日期时间类的后端口,Java SE 6和7。
由于我认为LocalDate
更符合您的要求,我真的认为您应该考虑一两个。 所以我建议不要用你的cal
private LocalDate date = LocalDate.now(ZoneId.systemDefault());
还要考虑是否需要JVM的当前时区设置(如上所述)或者您想要控制使用的时区。 这将有所作为。
最后,如果你真的坚持。 正如你现在所理解的那样,我不能在 GregorianCalendar
给你一个字符串。 您可以丢弃GregorianCalendar
的时间部分,这样您就只有日期部分。 你可以把它格式化成你喜欢的字符串。
public class GregorianCalendarDemo { private GregorianCalendar cal; public GregorianCalendarDemo() { cal = new GregorianCalendar(TimeZone.getDefault(), Locale.getDefault()); // discard time of day so we only have the date cal.set(Calendar.HOUR_OF_DAY, cal.getActualMinimum(Calendar.HOUR_OF_DAY)); cal.set(Calendar.MINUTE, cal.getActualMinimum(Calendar.MINUTE)); cal.set(Calendar.SECOND, cal.getActualMinimum(Calendar.SECOND)); cal.set(Calendar.MILLISECOND, cal.getActualMinimum(Calendar.MILLISECOND)); } protected GregorianCalendar getCal() { return cal; } public String getFormattedCal() { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); return format.format(getCal().getTime()); } }
当我刚刚调用getFormattedCal()
,它返回了2017-05-25
。
再次,确定时区和区域设置的默认值是否正常,或者您是否需要其他内容。
您可能认为我们可以仅使用cal.set(Calendar.HOUR_OF_DAY, 0):
来丢弃小时数,并且类似于分钟和秒。 至少在99%的情况下都可以使用它。 但是,如果转换到夏令时(夏令时),则不保证在0小时开始这一天,因此上述代码更具防弹性。
链接
ThreeTen Backport回家
您可以尝试使用SimpleDateFormat
作为示例:
GregorianCalendar cal = new GregorianCalendar(); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); format.setCalendar(cal); String result = format.format(cal.getTime()); System.out.println(result);//today is 2017-05-25
要将String转换为GregorianCalendar
:
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ssX"); Date date = format.parse("2017-05-25T14:36:52+03:00"); GregorianCalendar cal2 = new GregorianCalendar(); cal2.setTime(date);