无法在Java中的美国东部标准时间00:00:00和23:59:59正确解析日期

时间:2018-10-16 04:42:10

标签: java date debugging time simpledateformat

我正在尝试将startDate的时间设置为 00:00:00 ,将endDate的时间设置为 23:59:59 ,但是在调试startDate的时间是 8月4日09 10:30:00 IST 2018 ,并且endDate的时间是星期二8月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);

提供日期和日期的字符串是日期为 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);

2 个答案:

答案 0 :(得分:1)

tl; dr

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 ) ;

在跟踪一整天时,请勿试图确定最后一刻。我们通常使用Half-Open方法定义时间范围,其中开始是包含在内的,而结尾是排斥的。因此,一天从第一时刻开始(通常在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-Timemaintenance mode项目建议迁移到java.time类。

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

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

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

答案 1 :(得分:0)

如果需要IST计时,只需将EST从EST更改为IST 2:

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