Java日期给出不同的日期



我需要我的Java Android应用程序来提取和比较日期,但要获得正确的日期却一团糟。

TimeZone timeZone = TimeZone.getTimeZone("GMT");
Calendar calendar = Calendar.getInstance(timeZone);
Date currentTime = calendar.getTime();
Log.i(logtag, "Date currentTime="+currentTime);
String tidspunkt = calendar.get(Calendar.YEAR)+ "." + calendar.get(Calendar.MONTH)+"."+calendar.get(Calendar.DAY_OF_MONTH)+" "+calendar.get(Calendar.HOUR_OF_DAY)+":"+calendar.get(Calendar.MINUTE)+":"+calendar.get(Calendar.SECOND);
Log.i(logtag, "calendar.get(Calendar.YEAR)="+tidspunkt);
String tidspunkt2 = currentTime.getYear()+ "." + currentTime.getMonth()+"."+currentTime.getDay()+" "+currentTime.getHours()+":"+currentTime.getMinutes()+":"+currentTime.getSeconds();
Log.i(logtag, "currentTime.getYear()="+tidspunkt2);
currentTime.setYear(calendar.get(Calendar.YEAR));
currentTime.setMonth((calendar.get(Calendar.MONTH)));
currentTime.setDate(calendar.get(Calendar.DAY_OF_MONTH));
currentTime.setHours(calendar.get(Calendar.HOUR_OF_DAY));
currentTime.setMinutes(calendar.get(Calendar.MINUTE));
currentTime.setSeconds(calendar.get(Calendar.SECOND));
Log.i(logtag, "Date currentTime edited="+currentTime);
String tidspunkt3 = currentTime.getYear()+ "." + currentTime.getMonth()+"."+currentTime.getDay()+" "+currentTime.getHours()+":"+currentTime.getMinutes()+":"+currentTime.getSeconds();
Log.i(logtag, "currentTime.getYear() edited="+tidspunkt3);

实际运行时间:2022年1月10日星期一,22:29

结果:

  • 当前日期时间=2022年1月10日星期一22:29:53 GMT+01:00(正确日期(
  • calendar.get(calendar.YEAR(=2022.0.10 21:29:53(错误的月份,错误的小时(
  • currentTime.getYear((=122.0.1 22:29:53(错误的年份、错误的月份、错误的日期(
  • 当前编辑日期时间=1月10日星期二21:29:53 GMT+01:00 3922(错误的年份、错误的工作日、错误的时间(
  • currentTime.getYear((edited=2022.0.2 21:29:53(错误的月份、错误的日期、错误的小时(

我需要将旧日期保存为对象,然后能够从这些对象中提取正确的年、月、日等。所以我需要一个对象,既可以从中提取日期,也可以设置为我需要的任何旧日期。

这就是为什么java.util.Datejava.util.Calendar是糟糕的API,应该用java.time代替。你读过Date.setYear上的文档吗?或者看到Calendar.JANUARY是0?

您可以将java.time与安卓系统一起使用。

避免遗留类

永远不要使用时区、日历、日期。不要浪费时间去理解他们的怪异行为。Sun、Oracle和JCP社区几年前就放弃了这些课程,应该这样做。这些糟糕的类在几年前就被JSR310中定义的现代java.time类所取代。

java.time

捕捉UTC中的当前时刻(偏移量为零(。

Instant instant = Instant.now() ;

Instant类是一个功能有限的基本构建块类。要获得更大的灵活性,请转换为OffsetDateTimeZonedDateTime

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;
ZonedDateTime zdt = instant.atZone( ZoneId.of( "Asia/Tokyo" ) ) ;

注意,这里的所有三个对象,instantodt和&zdt,都表示同一时刻,同一时间线上的单个点。

要生成代表某个时刻的文本,你太努力了。让DateTimeFormatter来做举重。

Locale locale = Locale.CANADA_FRENCH ;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.LONG ).withLocale( locale ) ;
String output = zdt.format( f ) ;

java.time的实现内置于Android 26+中。对于早期的Android,最新的工具通过"API desugaring"提供了java.time的大部分功能。如果这对您不起作用,请使用java.time的后端端口,ThreeTenABP项目。

最新更新