我有一个带有 date 的字符串"10:00 AM 03/29/2011"
,我需要使用 Java 将其转换为 long ,我不能使用 Date 因为它已被弃用并且它没有给我正确的时间..所以我在网上查看了如何实现它但仍然没有运气。第一次使用java。
2 回答
问题是您正在解析数据,然后无缘无故地搞乱它,而忽略了记录在案的返回值Date.getYear()
等。
你可能只想要这样的东西:
private static Date parseDate(String text)
throws ParseException
{
SimpleDateFormat dateFormat = new SimpleDateFormat("hh:mm a MM/dd/yyyy",
Locale.US);
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
return dateFormat.parse(text);
}
如果你真的想要一个long
,只需使用:
private static long parseDate(String text)
throws ParseException
{
SimpleDateFormat dateFormat = new SimpleDateFormat("hh:mm a MM/dd/yyyy",
Locale.US);
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
return dateFormat.parse(text).getTime();
}
请注意,如果无法将值解析给调用者,我将决定做什么,这使得该代码更可重用。(如果你真的想要,你总是可以编写另一种方法来调用这个方法并吞下异常。)
与以往一样,我强烈建议您在 Java 中使用Joda Time进行日期/时间工作——它是一个比 java.util.Date/Calendar/etc 更简洁的 API。
java.time
java.util
日期时间 API 及其格式化 API已SimpleDateFormat
过时且容易出错。建议完全停止使用它们并切换到现代 Date-Time API *。
使用java.time
现代日期时间 API 的解决方案:
- 将日期时间字符串解析为
LocalDateTime
. - 转换
LocalDateTime
为Instant
. - 转换
Instant
为 Epoch 毫秒。
演示:
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
String strDateTime = "10:00 AM 03/29/2011";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("h:m a M/d/u", Locale.ENGLISH);
LocalDateTime ldt = LocalDateTime.parse(strDateTime, dtf);
Instant instant = ldt.atZone(ZoneId.systemDefault()).toInstant();
long epochMillis = instant.toEpochMilli();
System.out.println(epochMillis);
}
}
我的时区欧洲/伦敦的输出:
1301389200000
关于此代码的一些重要说明:
ZoneId.systemDefault()
为您提供 JVM 的ZoneId
.- 如果 2011 年 3 月 29 日上午 10:00 属于其他时区,请替换
ZoneId.systemDefault()
为适用的ZoneId
例如ZoneId.of("America/New_York")
. - 如果 2011 年 3 月 29 日上午 10:00 采用 UTC,您可以执行以下任一操作:
Instant
直接获取为ldt.toInstant(ZoneOffset.UTC)
或- 在此代码中替换
ZoneId.systemDefault()
为。ZoneId.of("Etc/UTC")
- Ideone 服务器(在线 IDE)的时区是 UTC,而伦敦的时区偏移了
+01:00
几个小时03/29/2011
,因此我的笔记本电脑的输出与您在 ONLINE DEMO 中看到的不同。算术: 1301389200000 + 60 * 60 * 1000 = 1301392800000
从Trail: Date Time了解有关现代日期时间 API 的更多信息。
* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,则可以使用ThreeTen-Backport,它将大部分java.time功能向后移植到 Java 6 和 7。如果您正在为 Android 项目和 Android API 工作level 仍然不符合 Java-8,请检查Java 8+ APIs available through desugaring和How to use ThreeTenABP in Android Project。