4

我有一个带有 date 的字符串"10:00 AM 03/29/2011",我需要使用 Java 将其转换为 long ,我不能使用 Date 因为它已被弃用并且它没有给我正确的时间..所以我在网上查看了如何实现它但仍然没有运气。第一次使用java。

4

2 回答 2

8

问题是您正在解析数据,然后无缘无故地搞乱它,而忽略了记录在案的返回值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。

于 2013-06-25T19:00:06.167 回答
1

java.time

java.util日期时间 API 及其格式化 API已SimpleDateFormat过时且容易出错。建议完全停止使用它们并切换到现代 Date-Time API *

使用java.time现代日期时间 API 的解决方案:

  1. 将日期时间字符串解析为LocalDateTime.
  2. 转换LocalDateTimeInstant.
  3. 转换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

ONLINE DEMO

关于此代码的一些重要说明:

  1. ZoneId.systemDefault()为您提供 JVM 的ZoneId.
  2. 如果 2011 年 3 月 29 日上午 10:00 属于其他时区,请替换ZoneId.systemDefault()为适用的ZoneId例如ZoneId.of("America/New_York").
  3. 如果 2011 年 3 月 29 日上午 10:00 采用 UTC,您可以执行以下任一操作:
    • Instant直接获取为ldt.toInstant(ZoneOffset.UTC)
    • 在此代码中替换ZoneId.systemDefault()为。ZoneId.of("Etc/UTC")
  4. 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 desugaringHow to use ThreeTenABP in Android Project

于 2021-06-15T12:19:54.163 回答