Java - 添加/附加时间开始时间(00:00:00.000)&到目前为止的结束时间(23.59.59.999)

时间:2016-07-22 14:01:41

标签: java mongodb datetime datetime-format

我的开始日期为“2016-06-01”,结束日期为“2016-07-01”(字符串格式),用于搜索MongoDB中的记录。需要指针/指南将开始时间(00:00:00.000)附加到开始日期和最长时间(23.59.59.999)到结束日期,如下所示在Java中使用java.util.DateMongoDB支持的任何其他人

Example : 
Start Date+with time : 2016-06-01T00:00:00.000
End Date+with time : 2016-07-01T23:59:59.999

4 个答案:

答案 0 :(得分:0)

公共类DateSample {

public static void main(String[] args) throws ParseException {

    String startDate = "2016-06-01";
    String endDate = "2016-07-01";

    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date strDate = formatter.parse(startDate+" 00:00:00.000");
    Date enDate = formatter.parse(endDate+" 23:59:59.999");
    System.out.println(formatter.format(strDate));
    System.out.println(formatter.format(enDate));

}

}

你会得到的 2016-06-01 00:00:00 2016-07-01 23:59:59

答案 1 :(得分:0)

您可以使用DateTimeFormatter.ISO_LOCAL_DATE_TIME。这是一个可能会对你要做的事情有所了解的例子:

DateTimeFormatter dtf = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
String startTime = "T00:00:00.000";
String endTime = "T23:59:59.999";
//here I used the LocalDateTime parser to parse the data+startTime/endTime
LocalDateTime startLocalDateTime = LocalDateTime.parse("2016-07-01"+startTime);
LocalDateTime endLocalDateTime = LocalDateTime.parse("2016-07-01"+endTime );
//with the LocalDateTime, you can then to whatever you want
//as an example, I am parsing it using ISO_LOCAL_DATE_TIME :
String strinStartTime= dtf.format(LocalDateTime.parse("2016-07-22"+startTime));

我希望这会有所帮助;

答案 2 :(得分:0)

如果您在jdk 1.8下运行,请使用LocalDateTime

LocalDateTime是jdk 1.8的嵌入式api。你可以在这里找到解释docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html。您可以使用减*或加*,并解析方法

答案 3 :(得分:0)

TL;博士

ZoneId zoneId = ZoneId.of( "Europe/Paris" ) ;
LocalDate startDate = LocalDate.of( "2016-06-01" ) ;
ZonedDateTime zdt start = startDate.atStartOfDay( zoneId ) ;
ZonedDateTime zdt stop = startDate.plusMonths(1).atStartOfDay( zoneId ) ;
// Perform database search where ( ( x >= start ) AND ( x < stop ) ) . Notice '>=' versus '<' with no 'equals' on the latter.

如果你需要字符串......

String outputStart = start.toInstant().toString() ;  // 2016-05-31T22:00:00Z  Paris in the summer is two hours ahead of UTC.
String outputStop = stop.toInstant().toString() ;  // 2016-06-30T22:00:00Z

详细

Answer by ishmaelMakitla的优点在于它指向使用Java 8及更高版本中内置的java.time类。但它侧重于字符串而不是对象。它也没有讨论时区的关键问题。

java.time类包括:

  • LocalDate表示仅限日期的值,没有时间段,没有时区。
  • LocalTime表示没有日期且没有时区的时间值。

    LocalDate startDate = LocalDate.parse(“2016-06-01”); //解析ISO 8601标准日期格式。 LocalTime startTime = LocalTime.MIN; // '00:00'。

这两个类都可以在工厂方法中用于实例化LocalDateTime和其他类。

LocalDateTime ldt = LocalDateTime.of( startDate , startTime );

在上面的代码中,我们使用LocalTime.MIN来获取00:00。要直接回答您的问题,您也可以使用LocalTime.MAX以相同的方式获取23:59:59.999999999。但我建议这样做。请阅读以下关于“半开放”的内容。

时区

时区对于确定日期和时间至关重要。对于任何给定时刻,日期和时间都按时区变化。巴黎午夜过后几分钟是新的一天,而蒙特利尔仍然是“昨天”。

Local…类型时间轴上的实际时刻。它们代表了关于可能的时刻的模糊概念。如上所述,巴黎6月1日的第一个时刻同时是5月31日下午6点在蒙特利尔。因此,在执行数据库搜索之前,您需要为LocalDateTime分配时区。应用ZoneId会生成ZonedDateTime个对象。

也许你的约会对象是巴黎。

ZoneId zoneId = ZoneId.of( "Europe/Paris" );
ZonedDateTime zdt = ldt.atZone( zoneId );

或许您打算UTC。这一切都取决于您的业务规则,即您的应用运营的环境。对于UTC,我们使用OffsetDateTime,因为UTC不是全时区,而是仅仅offset-from-UTC。时区是偏移量加上用于处理夏令时(DST)等异常的一组规则。

OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC );

要获取问题中要求的字符串,请提取LocalDate并调用toString()。但我不建议这样做,因为它忽略了时区(请在下面阅读)。

String output = odt.toLocalDateTime.toString();  // Not likely to be what you really need.

数据库中的最佳做法是以UTC格式存储日期时间。我不知道MongoDB。请务必阅读有关Java中的数据库驱动程序如何影响/转换您指定的值的文档。

一天的开始

请注意,有一天并不总是从00:00:00开始。在某些时区,DST或其他异常意味着该日可能会在某个其他时间开始,例如01:00

java.time类将在某些情况下根据需要进行调整。请务必阅读课程文档,以便了解该行为是否符合您的期望。需要。

您可以要求java.time查找开始时间。

ZonedDateTime zdt = LocalDate.of( "2016-06-01" ).atStartOfDay( zoneId );

半开

您尝试确定当天结束是一个问题。最后一秒是无限可分的。传统的面向Unix的库解析为整秒,Java中的旧日期时间类解析为毫秒,Postgres等一些数据库可以解析为微秒,而java.time和其他数据库(如H2)则解析为纳秒。不要介入其中。

通常在一段时间的日期时间编程中,最佳实践是“半开”。范围的开头是包含,而结尾是独占

因此,在巴黎地区搜索一个月的数据意味着搜索日期时间等于或晚于而不是(小于(但不包括)的记录停止。

ZoneId zoneId = ZoneId.of( "Europe/Paris" );
LocalDate startDate = LocalDate.of( "2016-06-01" );
ZonedDateTime zdt start = startDate.atStartOfDay( zoneId );
ZonedDateTime zdt stop = startDate.plusMonths(1).atStartOfDay( zoneId );
// Perform database search where ( ( x >= start ) AND ( x < stop ) ) . Notice '>=' versus '<' with no 'equals' on the latter.

同样,UTC的记录月而不是巴黎。

ZoneOffset zoneOffset = ZoneOffset.UTC;
LocalDate startDate = LocalDate.of( "2016-06-01" );
OffsetDateTime start = OffsetDateTime.of( startDate , zoneOffset );
OffsetDateTime stop = OffsetDateTime.plusMonths(1).of( startDate , zoneOffset );
// Perform database search where ( ( x >= start ) AND ( x < stop ) ) . Notice '>=' versus '<' with no 'equals' on the latter.

在整个应用程序中始终如一地使用半开放式方法,处理时间跨度将使您的代码更加明智且易于理解。您还可以训练您的用户以这种方式思考。我们都在“午休时间从12:00到13:00”等情况下直观地使用半开放式。我们都知道这意味着在时钟<{1>}之前从午餐回来。