当前位置: 首页 > 知识库问答 >
问题:

给出不同日期的Java日期

金兴朝
2023-03-14

我需要我的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

结果:

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

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

共有2个答案

翟源
2023-03-14

从不使用时区、日历、日期。不要浪费你的时间去理解他们奇怪的行为。Sun、Oracle和JCP社区多年前就放弃了这些课程,您也应该这么做。多年前,这些糟糕的类被现代java所取代。JSR 310中定义的时间类。

捕获UTC中显示的当前时刻(偏移量为零)。

Instant instant = Instant.now() ;

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

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

请注意,这里的所有三个对象,< code>instant、< code>odt,

要生成代表某个时刻的文本,您工作得太辛苦了。让DateTimeFormatter完成繁重的工作。

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

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

鲜于德泽
2023-03-14

这就是为什么“日期”“日历”是可怕的 API,你应该用 java.time 替换它们。您是否已阅读日期设置上的文档?或者看到日历.1月是0?

您可以使用java.time与Android的脱糖。

 类似资料:
  • 问题内容: 当我运行此代码时: 我在Eclipse的JUnit运行程序中得到以下结果: 这导致从命令行Maven: 如您所见,时间有所不同。 (同一台计算机,相同的Java版本,可能相隔30秒)。为什么? [编辑] 时区也不同。从Maven 启动和从Eclipse 启动时,为什么要使用Java ? 或换一种说法:如何强制Java使用两者? 问题答案: 要指定默认时区,您可以设置系统属性。您可以通过

  • 问题内容: 我有一个字符串形式的日期。我必须将其更改为Sql Date。所以为此,我使用了以下代码。 当我使用上面的代码并运行它。我得到以下输出。 此处月份未正确转换。 请告诉我问题出在哪里,并提供示例代码以获得正确的结果? 问题答案: 是 分钟 。你想为 月 : 不要感到难过-这个确切的错误经常出现。

  • 我有两个字符串格式的日期:说,格式为。比较日期1和日期2的相等性的最佳方法是什么?我不关心时间,只关心日、年、月。我应该将它们转换为即时并进行比较吗?

  • 问题内容: 我有一个简单的方法,应该获取当前日期,将其放入某种格式,然后将其作为String返回。到目前为止,一切都很好(上次尝试于1月31日进行),但由于某种原因,当我今天尝试使用它时,它返回字符串“2013-02-43”。 显然,二月份没有43天,而且我不知道为什么要返回此日期。我到处都在寻找解决方案,但似乎没有一个适合我遇到的特定问题。这是代码: 仅出于记录目的,我尝试使用Calendar.

  • 而输出是 谁能详细说明一下1380605909318和61341428160000之间的区别?

  • 问题内容: 我创建了一些小的方法作为Util类,例如以下代码: 并且,进行了非常简单的运行,如下所示: 结果是一个很奇怪的日期-> 2017/07/187 搜索了类似的问题,并尝试了TimeZone,Locale,但没有帮助。有什么建议 ? 顺便说一句,这是我的环境: Windows7 x86 JDK 1.8.0.131 x86 Oxygen corrosion of x86 问题答案: 您格式化