Java 需要帮助尝试格式化DateTime吗
因此,对于我的任务,我被指示为Shopify集成创建单元测试。我的一个断言方法要求我以某种方式格式化日期 我的assert方法是this,下面的跟踪如下。要跟上纪录片的节奏真的很困难Java 需要帮助尝试格式化DateTime吗,java,datetime,junit,shopify,datetimeoffset,Java,Datetime,Junit,Shopify,Datetimeoffset,因此,对于我的任务,我被指示为Shopify集成创建单元测试。我的一个断言方法要求我以某种方式格式化日期 我的assert方法是this,下面的跟踪如下。要跟上纪录片的节奏真的很困难 assertEquals((new Date(2020, 7, 23)),order.getCreatedAt()); java.lang.AssertionError: expected:<Mon Aug 23 00:00:00 EDT 3920> but was:<2020-07-23T11
assertEquals((new Date(2020, 7, 23)),order.getCreatedAt());
java.lang.AssertionError: expected:<Mon Aug 23 00:00:00 EDT 3920> but was:<2020-07-23T11:47:45.000-04:00>
assertEquals((新日期(2020年7月23日)),order.getCreatedAt();
java.lang.AssertionError:应为:但为:
我建议您从过时且容易出错的java.util.Date
切换到
您的代码出了什么问题:
java.util.Date
将第一个月视为0
,这意味着7
代表August
。此外,它还将1900
添加到参数year
,这意味着对于2020
作为此参数的值,它将为您提供一个年设置为3920
的对象。我希望,这足以理解java.util.Date
的设计有多么糟糕
使用现代日期时间API:
您可以按如下方式进行操作:
OffsetDateTime testData = OffsetDateTime.of(LocalDateTime.of(2020, Month.JULY, 23, 11, 47, 45, 0),
ZoneOffset.ofHours(-4));
assertEquals(testData, order.getCreatedAt());
这是基于这样的假设,即order.getCreatedAt()
返回OffsetDateTime
的对象。请注意,您可以使用,7
代替Month.JULY
,但后者是表示月份值的惯用方式
如果order.getCreatedAt()
返回2020-07-23T11:47:45.000-04:00
为String
,则可以将其解析为OffsetDateTime
,如下所示:
import java.time.LocalDateTime;
import java.time.Month;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
public class Main {
public static void main(String[] args) {
// Parse the given date-time string to OffsetDateTime
OffsetDateTime orderCreatedAt = OffsetDateTime.parse("2020-07-23T11:47:45.000-04:00");
// Create test data
OffsetDateTime testData = OffsetDateTime.of(LocalDateTime.of(2020, Month.JULY, 23, 11, 47, 45, 0),
ZoneOffset.ofHours(-4));
// Display
System.out.println(orderCreatedAt);
System.out.println(testData);
// Assert
//assertEquals(testData, orderCreatedAt);
}
}
输出:
2020-07-23T11:47:45-04:00
2020-07-23T11:47:45-04:00
从了解有关现代日期时间API的更多信息如果只需要比较日期部分请使用
java.time.LocalDate
并停止使用java.util.date
,则需要截断日期对象并获得时间部分