【问题标题】:Could not parse Date correctly for 00:00:00 and 23:59:59 EST in Java无法正确解析 Java 中 00:00:00 和 23:59:59 EST 的日期
【发布时间】:2018-10-16 04:42:10
【问题描述】:

我试图将 startDate 的时间传递为​​ 00:00:00 并将 endDate 的时间传递为​​ 23:59:59 但在调试期间 startDate 的时间是 8 月星期四09 10:30:00 IST 2018 和 endDate 的时间是 Tue Aug 14 10:29:59 IST 2018。我哪里做错了?

SimpleDateFormat estFormat=new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
estFormat.setTimeZone(TimeZone.getTimeZone("EST"));

Date startDate=estFormat.parse(sdate+" 00:00:00");
object.setStartDate(startDate);

Date endDate=estFormat.parse(edate+" 23:59:59"); 
object.setEndDate(endDate);

如果 sdate 和 edate 是具有 MM/dd/yyyy 格式的日期的字符串。

解决方案:使用 JAVA-TIME API

    sdate=sdate.trim()+" 00:00:00";
    edate=edate.trim()+" 23:59:59";
    DateTimeFormatter df = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss");
    LocalDateTime localdatetime = LocalDateTime.parse(sdate,df);
    Date startDate = Date.from(localdatetime.atZone(ZoneId.of("America/New_York" )).toInstant());
    object.setStartDate(startDate);

    localdatetime = LocalDateTime.parse(edate,df);
    Date endDate = Date.from(localdatetime.atZone(ZoneId.of("America/New_York" )).toInstant());
    object.setEndDate(endDate);

【问题讨论】:

  • 没有问题,您得到了您要求的美国东部时间。您看到的是当您 打印 值时转换为印度时间的时间。这是输出的格式问题。内存中的值是正确的。请记住,java.util.Date 没有时区,内部存储为 UTC。解析和格式化值时应用时区转换。
  • 我建议你避免使用SimpleDateFormat 类。它不仅过时了,而且出了名的麻烦。今天我们在java.time, the modern Java date and time API 中做得更好。
  • 那么说明代码中传递的日期是正确的吗?并会产生正确的输出?@Andreas
  • 好的,我会试试joda time,如果我遇到任何错误,我会在这里发布..@OleV.V.
  • 只是为了防止您误读,我说的是 java.time,而不是 Joda-Time。 Joda-Time 已经向前迈进了一步,但处于维护模式。 java.time 是相关的,是两者中更现代的一种。

标签: java date debugging time simpledateformat


【解决方案1】:

tl;博士

LocalDate
.of( 2018 , Month.MAY , 23 )
.atStartOfDay(
    ZoneId.of( "America/New_York" )
)

详情

永远不要使用糟糕的旧日期时间类,例如 Date

使用现代 java.time 类。

ZoneId z = ZoneId.of( "America/New_York" ) ;
LocalDate ld = LocalDate.of( 2018 , Month.MAY , 23 ) ;
ZonedDateTime zdtStart = ld.atStartOfDay( z ) ;

跟踪一整天时,不要试图确定最后一刻。我们通常使用半开放方法定义时间跨度,其中开始是包容性的,而结束是排斥性的。因此,一天从第一刻开始(通常在 00:00,但并非总是如此),一直持续到(但不包括)下一天的第一刻。

LocalDate dayAfter = ld.plusDays( 1 ) ;
ZonedDateTime zdtStop = dayAfter.atStartOfDay( z ) ;

提示:将ThreeTen-Extra 库添加到您的项目以访问Interval 类。

org.threeten.extra.Interval interval = 
    Interval.of( 
        zdtStart.toInstant() ,
        zdtStop.toInstant()
    )
;

该类带有方便的比较方法,例如abutscontainsenclosesintersection 等。

boolean containsMoment = interval.contains( Instant.now() ) ;

关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。

从哪里获得 java.time 类?

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

【讨论】:

    【解决方案2】:

    如果您想要 IST 计时,只需将您的第 2 行从 EST 更改为 IST:

    estFormat.setTimeZone(TimeZone.getTimeZone("IST"));
    

    【讨论】:

      猜你喜欢
      • 2021-07-05
      • 2021-02-08
      • 1970-01-01
      • 2020-04-20
      • 2021-06-11
      • 2013-12-06
      • 1970-01-01
      • 2021-09-04
      • 2014-08-09
      相关资源
      最近更新 更多