从 "datetime-local" 到 java.sql.Timestamp 的转换
Conversion from "datetime-local" to java.sql.Timestamp
我在 jsp 页面上有一个输入类型为 "datetime-local" 的表单,数据被传递给 servlet:
String resetTimeString = request.getParameter(RequestParameterName.RESET_TIME);
如何将输入转换为java.sql.Timestamp
?
编辑:
嗯,我发现了一些新东西!
您可以使用 Timestamp.valueOf()
来格式化值为 yyyy-[m]m-[d]d hh:mm:ss[.f...]
的时间字符串
所以它也可以处理 micro/nano 秒。您唯一需要做的就是用 space 替换 T。
这个有效:
String datetimeLocal = "1985-04-12T23:20:50.52";
System.out.println(Timestamp.valueOf(datetimeLocal.replace("T"," ")));
输出:
1985-04-12 23:20:50.52
根据 this site 你的 resetTimeString 看起来像这样:'1985-04-12T23:20:50.52' (一个字符串)
我找不到直接将其转换为时间戳的方法,但您可以手动将其拆分:
String[] dateTime = datetimeLocal.split("T");
String[] date = dateTime[0].split("-");
String[] time = dateTime[1].split(":");
这将打印:
System.out.println("DateTime: " + Arrays.toString(dateTime));
System.out.println("Date: " + Arrays.toString(date));
System.out.println("Time: " + Arrays.toString(time));
>>> DateTime: [1985-04-12, 23:20:50]
>>> Date: [1985, 04, 12]
>>> Time: [23, 20, 50]
之后您可以创建一个新的时间戳:(已弃用!)
Timestamp stamp = new Timestamp(Integer.valueOf(date[0]).intValue() - 1900,
Integer.valueOf(date[1]).intValue(),
Integer.valueOf(date[2]).intValue(),
Integer.valueOf(time[0]).intValue(),
Integer.valueOf(time[1]).intValue(),
Integer.valueOf(time[2].split("\.")[0]).intValue(),
Integer.valueOf(time[2].split("\.")[1]).intValue());
请注意,如果您使用它,则需要从年份中减去“1900”并用 \.
拆分点
此外,您需要处理纳秒(在我的示例中,我使用值 50.52 作为秒,但从您的服务器返回的字符串可能不包含纳秒)
您还可以从日期计算多头并使用 new Timestamp(<long>)
希望对您有所帮助:)
如果秒设置为 "00"
,Cyphrags 的回答将不起作用,因为 Chrome 不会发送秒部分,从而在调用 [=13= 时导致 java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]
].
因此,更完整的答案可能是:
String datetimeLocal = "1985-04-12T23:20";
// make sure the seconds are set before parsing
if (StringUtils.countMatches(datetimelocal, ":") == 1) {
datetimelocal += ":00";
}
Timestamp value = Timestamp.valueOf(datetimeLocal.replace("T", " "));
我在 jsp 页面上有一个输入类型为 "datetime-local" 的表单,数据被传递给 servlet:
String resetTimeString = request.getParameter(RequestParameterName.RESET_TIME);
如何将输入转换为java.sql.Timestamp
?
编辑: 嗯,我发现了一些新东西!
您可以使用 Timestamp.valueOf()
来格式化值为 yyyy-[m]m-[d]d hh:mm:ss[.f...]
的时间字符串
所以它也可以处理 micro/nano 秒。您唯一需要做的就是用 space 替换 T。
这个有效:
String datetimeLocal = "1985-04-12T23:20:50.52";
System.out.println(Timestamp.valueOf(datetimeLocal.replace("T"," ")));
输出:
1985-04-12 23:20:50.52
根据 this site 你的 resetTimeString 看起来像这样:'1985-04-12T23:20:50.52' (一个字符串)
我找不到直接将其转换为时间戳的方法,但您可以手动将其拆分:
String[] dateTime = datetimeLocal.split("T");
String[] date = dateTime[0].split("-");
String[] time = dateTime[1].split(":");
这将打印:
System.out.println("DateTime: " + Arrays.toString(dateTime));
System.out.println("Date: " + Arrays.toString(date));
System.out.println("Time: " + Arrays.toString(time));
>>> DateTime: [1985-04-12, 23:20:50]
>>> Date: [1985, 04, 12]
>>> Time: [23, 20, 50]
之后您可以创建一个新的时间戳:(已弃用!)
Timestamp stamp = new Timestamp(Integer.valueOf(date[0]).intValue() - 1900,
Integer.valueOf(date[1]).intValue(),
Integer.valueOf(date[2]).intValue(),
Integer.valueOf(time[0]).intValue(),
Integer.valueOf(time[1]).intValue(),
Integer.valueOf(time[2].split("\.")[0]).intValue(),
Integer.valueOf(time[2].split("\.")[1]).intValue());
请注意,如果您使用它,则需要从年份中减去“1900”并用 \.
此外,您需要处理纳秒(在我的示例中,我使用值 50.52 作为秒,但从您的服务器返回的字符串可能不包含纳秒)
您还可以从日期计算多头并使用 new Timestamp(<long>)
希望对您有所帮助:)
如果秒设置为 "00"
,Cyphrags 的回答将不起作用,因为 Chrome 不会发送秒部分,从而在调用 [=13= 时导致 java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]
].
因此,更完整的答案可能是:
String datetimeLocal = "1985-04-12T23:20";
// make sure the seconds are set before parsing
if (StringUtils.countMatches(datetimelocal, ":") == 1) {
datetimelocal += ":00";
}
Timestamp value = Timestamp.valueOf(datetimeLocal.replace("T", " "));