将 HTML 日期输入解析为 Java Servlet 中的时间戳
Parsing HTML date input into Timestamp in Java Servlet
最近我遇到了时间戳和 HTML 输入类型日期的问题:
这是我的 HTML/JSP:
<div class="form-group">
<label>Your day of birth</label>
<input class="form-control form-control-lg" type="date" name="txtBirthdate" required="">
</div>
这是我的 Java Servlet:
String birth = request.getParameter(Constants.BIRTHDATE_TXT);
System.out.println(birth);
Timestamp bDate = new Timestamp(((new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(birth)).getTime()));
System.out.println(bDate);
Timestamp joinDate = new Timestamp(Calendar.getInstance().getTime().getTime());
我无法将 String birth 解析为 Timestamp,有什么方法可以转换它吗?当您使用 SimpleDateFormat 删除 yyyy-MM-dd 字符串时,我也是对的,它会将 HH:mm:ss 部分设置为默认值为 00:00:0000?
感谢您的帮助
java.util
的日期时间 API 及其格式 API、SimpleDateFormat
已过时且容易出错。请注意,java.sql.Timestamp
继承了扩展 java.util.Date
的相同缺点。建议完全停止使用它们并切换到 modern date-time API. For any reason, if you have to stick to Java 6 or Java 7, you can use ThreeTen-Backport which backports most of the java.time functionality to Java 6 & 7. If you are working for an Android project and your Android API level is still not compliant with Java-8, check Java 8+ APIs available through desugaring and .
你提到过,
My problem is I don't really know how to parse date like example:
"2020-12-28" into Timestamp
你也提到了,
And also am I right when you pare the yyyy-MM-dd string using the
SimpleDateFormat, it will set the HH:mm:ss part with default value is
00:00:0000?
从这两个要求,我推断你需要一个日期,例如2020-12-28
结合时间,例如00:00:00
这只不过是一天的开始。 java.time
提供了一个干净的 API, LocalDate#atStartOfDay
来实现这个。
演示:
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
String strDate = "2020-12-28";
// Parse the given date string into LocalDate. Note that you do not need a
// DateTimeFormatter to parse it as it is already in ISO 8601 format
LocalDate date = LocalDate.parse(strDate);
// Note: In the following line, replace ZoneId.systemDefault() with the required
// Zone ID which specified in the format, Continent/City e.g.
// ZoneId.of("Europe/London")
ZonedDateTime zdt = date.atStartOfDay(ZoneId.systemDefault());
// Print the default format i.e. the value of zdt#toString. Note that the
// default format omits seconds and next smaller units if seconds part is zero
System.out.println(zdt);
// Get and print just the date-time without timezone information
LocalDateTime ldt = zdt.toLocalDateTime();
System.out.println(ldt);
// Get and print zdt in a custom format
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSS", Locale.ENGLISH);
String formatted = zdt.format(dtf);
System.out.println(formatted);
}
}
输出:
2020-12-28T00:00Z[Europe/London]
2020-12-28T00:00
2020-12-28T00:00:00.000
了解现代日期时间 API
最近我遇到了时间戳和 HTML 输入类型日期的问题:
这是我的 HTML/JSP:
<div class="form-group">
<label>Your day of birth</label>
<input class="form-control form-control-lg" type="date" name="txtBirthdate" required="">
</div>
这是我的 Java Servlet:
String birth = request.getParameter(Constants.BIRTHDATE_TXT);
System.out.println(birth);
Timestamp bDate = new Timestamp(((new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(birth)).getTime()));
System.out.println(bDate);
Timestamp joinDate = new Timestamp(Calendar.getInstance().getTime().getTime());
我无法将 String birth 解析为 Timestamp,有什么方法可以转换它吗?当您使用 SimpleDateFormat 删除 yyyy-MM-dd 字符串时,我也是对的,它会将 HH:mm:ss 部分设置为默认值为 00:00:0000?
感谢您的帮助
java.util
的日期时间 API 及其格式 API、SimpleDateFormat
已过时且容易出错。请注意,java.sql.Timestamp
继承了扩展 java.util.Date
的相同缺点。建议完全停止使用它们并切换到 modern date-time API. For any reason, if you have to stick to Java 6 or Java 7, you can use ThreeTen-Backport which backports most of the java.time functionality to Java 6 & 7. If you are working for an Android project and your Android API level is still not compliant with Java-8, check Java 8+ APIs available through desugaring and
你提到过,
My problem is I don't really know how to parse date like example: "2020-12-28" into Timestamp
你也提到了,
And also am I right when you pare the yyyy-MM-dd string using the SimpleDateFormat, it will set the HH:mm:ss part with default value is 00:00:0000?
从这两个要求,我推断你需要一个日期,例如2020-12-28
结合时间,例如00:00:00
这只不过是一天的开始。 java.time
提供了一个干净的 API, LocalDate#atStartOfDay
来实现这个。
演示:
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
String strDate = "2020-12-28";
// Parse the given date string into LocalDate. Note that you do not need a
// DateTimeFormatter to parse it as it is already in ISO 8601 format
LocalDate date = LocalDate.parse(strDate);
// Note: In the following line, replace ZoneId.systemDefault() with the required
// Zone ID which specified in the format, Continent/City e.g.
// ZoneId.of("Europe/London")
ZonedDateTime zdt = date.atStartOfDay(ZoneId.systemDefault());
// Print the default format i.e. the value of zdt#toString. Note that the
// default format omits seconds and next smaller units if seconds part is zero
System.out.println(zdt);
// Get and print just the date-time without timezone information
LocalDateTime ldt = zdt.toLocalDateTime();
System.out.println(ldt);
// Get and print zdt in a custom format
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSS", Locale.ENGLISH);
String formatted = zdt.format(dtf);
System.out.println(formatted);
}
}
输出:
2020-12-28T00:00Z[Europe/London]
2020-12-28T00:00
2020-12-28T00:00:00.000
了解现代日期时间 API