- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经对服务进行了单元测试,当我执行 Jenkins 作业时,每个测试方法都正确通过,除了一个。
但这个测试方法可以在我的机器上运行,无论是使用 Eclipse 还是使用 mvn
命令。
// TARGET_RUN_DATE_OF_YEAR = "2018-01-01"
@Test
public void dateToTimestamp() {
Service service = getService();
String df = "YYYY-MM-dd";
String invalid = "INVALID";
// Check success
Timestamp timestamp = service.dateToTimestamp(TARGET_RUN_DATE_OF_YEAR, df);
Assert.assertEquals(service.getTodayTimestamp(), timestamp); // <-- Fail here
// Check failure
Assert.assertNull(service.dateToTimestamp(TARGET_RUN_DATE_OF_YEAR, invalid));
Assert.assertNull(service.dateToTimestamp(invalid, df));
}
该服务有多种方法:
getTodayTimestamp
给出今天的时间戳,此方法经过测试,在我的机器和 Jenkins 上都有效。dateToTimestamp
将日期和 dateFormat 作为字符串,并将日期作为时间戳返回,此方法不起作用。服务中的dateToTimestamp
方法:
private Timestamp dateToTimestamp(String date, DateFormat df) throws ParseException {
return new Timestamp(df.parse(date).getTime());
}
@Override
public Timestamp dateToTimestamp(String date, String dateFormatString) {
try {
DateFormat df = new SimpleDateFormat(dateFormatString);
return dateToTimestamp(date, df);
} catch (Exception e) {
log.warn("Exception during conversion of date to timestamp, exception : {}", e);
return null;
}
}
正如我之前所说,测试在我的电脑上完美运行,但在 Jenkins 上却不行(向此方法添加 @Ignore
注释,使工作成功)。
启 Action 业时,我收到此错误:
Failed tests: dateToTimestamp(com.test.service.ServiceImplTest): expected:<2018-01-01 00:00:00.0> but was:<2017-12-31 00:00:00.0>
我可以保证的是,即使在 Jenkins 中,dateToTimestamp
方法也会采用参数TARGET_RUN_DATE_OF_YEAR
,即“2018-01-01”
code> 和 dateFormat 字符串为 "YYYY-MM-dd"
。但仍返回 2017-12-31 00:00:00.0
作为时间戳。
有什么想法吗?
最佳答案
我假设您想要一个用于 SQL 数据库的时间戳
。 2019 年不要使用 Timestamp
。该类设计不佳且早已过时。
timestamp with time zone
(它应该是时间戳),请在 Java 中使用 OffsetDateTime
。时间戳
(不含时区),请在 Java 中使用 LocalDateTime
。代码示例:
String dateString = "2018-01-01";
OffsetDateTime odt = LocalDate.parse(dateString)
.atStartOfDay()
.atOffset(ZoneOffset.UTC);
System.out.println(odt);
输出是:
2018-01-01T00:00Z
现在您可以使用以下方法将 OffsetDateTime
传递给 JDBC:
yourPreparedStatement.setObject(4, odt);
我相信您同时遇到了两个问题:
YYYY
是不正确的。大写的 Y
表示基于周的年份,并且仅对周数有用。使用旧的且麻烦的 SimpleDateFormat
,您需要小写的 y
来表示年份。演示:
String dateString = "2018-01-01";
String dateFormatString = "YYYY-MM-dd"; // Incorrect format pattern string
DateFormat df = new SimpleDateFormat(dateFormatString);
System.out.println(df.parseObject(dateString));
我的计算机上的输出(丹麦语言环境、欧洲/哥本哈根时区):
Mon Jan 01 00:00:00 CET 2018
但是如果我首先这样做:
Locale.setDefault(Locale.US);
——那么上面代码片段的输出是不同的,即:
Sun Dec 31 00:00:00 CET 2017
所发生的情况是,SimpleDateFormat
放弃根据基于周的年、月和月中的日来确定确切的日期,而是只为您提供基于周的年份的第一个日期。 SimpleDateFormat
的典型行为是给您一个不可能正确的结果,但又假装一切正常。在某些区域设置中,一周从星期一开始,您会得到 Mon Jan 01,这恰好与您的字符串一致。在其他地区(例如美国),一周从星期日开始,因此您会看到前一年的 12 月 31 日星期日。
Y
的相关问题:java parsing string to date 关于java - DateFormat UnitTest 在 Jenkins 中失败,但在本地失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57867886/
我已经从代码隐藏动态生成文本框,一个类“DateTextBox”被设置为所有动态生成的文本框控件。日期选择器控件设置为类,但每个文本控件需要不同的日期格式。如何为每个文本框的 DatePicker 设
我正在开发一个不是我构建的网站,并且有一个页面不断在控制台中给出错误“Uncaught ReferenceError: dateFormat is not Define” 下面是包含错误的 JS(第
我认为这可能是 Android studio 的一个错误,不幸的是它阻止了我继续前进。 我正在使用(并选择!)android.text.format.DateFormat 作为我的 DateForma
我在android上阅读了一些关于格式化日期的帖子,像这样: How do you format date and time in Android? 人们建议使用 android.text.forma
其他类如 SimpleDateFormat 也是如此。Java 有一个 java.text.SimpleDateFormatAndroid 有 android.icu.text.SimpleDateF
我对 SimpleDateFormat 有疑问。 SimpleDateFormat dtfmt=new SimpleDateFormat("dd MMM yyyy hh:mm a", Locale.g
我尝试使用 SimpleDateFormat 解析日期,但遇到了奇怪的行为。 此示例在我的计算机上打印“Sun Jan 01 19:00:32 CET 2012”: import java.text.
上图是日期选择器,我点击确定后,结果如下图所示。 代码如下 public class DatePickerFragment extends DialogFragment implements
我正在尝试解析为“Mar 28,2017 13:00”类型的 Java 日期字符串。 我写了以下代码 DateFormat df = new SimpleDateFormat("MMM
如何将日期格式设置为以下 View 2018 年 10 月 21 日(月份大写)?我可以通过 "%1$TB %1$te, %1$tY" 模式获取它,但我需要通过 SimpleDateFormat 来完
例如: 用户可以输入 01/23/1983 或 1/23/1983 我如何使用 DateFormat 编写两种不同的格式,例如 (MM/DD/YYYY) 和 (M/DD/YYYY) 并将它们与实际日期
我可能忽略了一些东西,但是从字符串解析到日期对我来说无法正常工作。我有字符串:“20110705_060229”,格式为:“YYYYddMM_HHmmss” 这段代码: Date triggermom
我正在尝试使用 DateFormat 类和 格式模式来解析字符串 "20/08/18 13:21:00:428" “dd/MM/yy”“HH:mm:ss:SSS”。时区设置为 BST。 上述返回的日期
这就是我正在做的事情: SimpleDateFormat parserSDF = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzzz yyyy", Local
运行以下代码时出现意外输出, DateFormat df = new SimpleDateFormat("YYYY-MM-dd"); Date date = df.parse("2012-06-23"
我正在尝试将时差显示为一个字符串,该字符串遵循 00:00:00(小时:分钟:秒)的形式,并用零填充。我有以下代码: long timeDiff = System.currentTimeMillis(
我在将 json 对象中收到的日期转换为其所需的格式时遇到问题。我从后端获得的日期是 4 月 13 日,星期三,下午 04:06:00。这就是我所做的。 String refreshDateStrin
String selectedDate = "2012-" + createdMonth + "-" + createdDay; SimpleDateFormat dateFormat = new S
我想将 String 转换为 Date。我的代码: String maturityDate = "20150722"; SimpleDateFormat formatter = new
我通过 SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").parse(DateinString) 将日期字符串转换为 Date。 这里不是转换为 UTC,而是转换为
我是一名优秀的程序员,十分优秀!