47

我有一种日期和时间格式,如下所示:

Tue Apr 23 16:08:28 GMT+05:30 2013

我想转换成毫秒,但我实际上不知道它是哪种格式。任何人都可以帮助我。

4

10 回答 10

101

API 26 中引入的DateTimeFormatter更新。

对于 API 26 及更高版本,代码可以编写如下

// Below Imports are required for this code snippet
// import java.util.Locale;
// import java.time.LocalDateTime;
// import java.time.ZoneOffset;
// import java.time.format.DateTimeFormatter;
String date = "Tue Apr 23 16:08:28 GMT+05:30 2013";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH);
LocalDateTime localDate = LocalDateTime.parse(date, formatter);
long timeInMilliseconds = localDate.atOffset(ZoneOffset.UTC).toInstant().toEpochMilli();
Log.d(TAG, "Date in milli :: FOR API >= 26 >>> " + timeInMilliseconds);
// Output is -> Date in milli :: FOR API >= 26 >>> 1366733308000

但截至目前,只有 6% 的设备运行在 26 或更高版本上。因此,您将需要上述类的向后兼容性。JakeWharton编写了基于ThreeTenBP的ThreeTenABP,但专门开发用于 Android。阅读更多关于如何以及为什么应该使用 ThreeTenABP 而不是 java.time、ThreeTen-Backport 甚至 Joda-Time

所以使用 ThreeTenABP,上面的代码可以写成(并在 API 16 到 API 29 上验证)

// Below Imports are required for this code snippet
// import java.util.Locale;
// import org.threeten.bp.OffsetDateTime;
// import org.threeten.bp.format.DateTimeFormatter;
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
        "EEE MMM dd HH:mm:ss OOOO yyyy", Locale.ROOT);
String givenDateString = "Tue Apr 23 16:08:28 GMT+05:30 2013";
long timeInMilliseconds = OffsetDateTime.parse(givenDateString, formatter)
        .toInstant()
        .toEpochMilli();
System.out.println("Date in milli :: USING ThreeTenABP >>> " + timeInMilliseconds);
// Output is -> Date in milli :: USING ThreeTenABP >>> 1366713508000

Ole 在他的回答中涵盖了总结信息(也适用于 Java),您应该研究一下。


以下是现在不应使用的旧方法(以及此答案的先前版本)

使用下面的方法

String givenDateString = "Tue Apr 23 16:08:28 GMT+05:30 2013"; 
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
try {
    Date mDate = sdf.parse(givenDateString);
    long timeInMilliseconds = mDate.getTime();
    System.out.println("Date in milli :: " + timeInMilliseconds);
} catch (ParseException e) {
            e.printStackTrace();
}

阅读有关日期和时间模式字符串的更多信息。

于 2013-10-17T06:13:59.853 回答
13

尝试这个...

Calendar calendar = Calendar.getInstance();
calendar.set(datePicker.getYear(), datePicker.getMonth(), datePicker.getDayOfMonth(), 
             timePicker.getCurrentHour(), timePicker.getCurrentMinute(), 0);
long startTime = calendar.getTimeInMillis();
于 2017-02-24T05:56:04.723 回答
12

您可以使用此代码

long miliSecsDate = milliseconds ("2015-06-04");
Log.d("miliSecsDate", " = "+miliSecsDate);

    public long milliseconds(String date) 
    {
        //String date_ = date;
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try
        {
            Date mDate = sdf.parse(date);
            long timeInMilliseconds = mDate.getTime();
            System.out.println("Date in milli :: " + timeInMilliseconds);
            return timeInMilliseconds;
        }
        catch (ParseException e) 
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return 0;
    }
于 2015-06-04T17:46:41.550 回答
10

在科特林,

只需使用

timeInMilSeconds = date.time

哪里timeInMilSeconds是毫秒(var timeInMilSeconds: Longdate日期

于 2018-05-21T06:08:10.937 回答
2
Date beginupd = new Date(cursor1.getLong(1));

此变量 beginupd 包含格式

Wed Oct 12 11:55:03 GMT+05:30 2011

long millisecond = beginupd.getTime();

Date.getTime() JavaDoc states:

返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。

于 2013-10-17T06:09:21.840 回答
2

在 Kotlin 中试试这个,

val calendar = Calendar.getInstance()
val UniqueID = calendar.timeInMillis

Java中的相同代码,

Calendar calendar = Calendar.getInstance(); long time = calendar.getTimeInMillis();
于 2018-08-02T11:07:42.790 回答
2

java.time 和 ThreeTenABP

我提供的是现代答案——尽管它并不比它在你的 Android API 级别上的工作更现代。

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
            "EEE MMM dd HH:mm:ss OOOO yyyy", Locale.ROOT);
    String givenDateString = "Tue Apr 23 16:08:28 GMT+05:30 2013";
    long timeInMilliseconds = OffsetDateTime.parse(givenDateString, formatter)
            .toInstant()
            .toEpochMilli();
    System.out.println(timeInMilliseconds);

此片段的输出是:

1366713508000

大多数其他答案中使用的SimpleDateFormat,DateCalendar类设计不佳,现在早已过时。我建议您改用 java.time,这是现代 Java 日期和时间 API。编辑:2013 年提出问题时,其他答案都是很好的答案。只有时间在流逝,我们不应该再使用SimpleDateFormat,Date等等Calendar

问题:java.time 不需要 Android API 级别 26 吗?

java.time 在较旧和较新的 Android 设备上都能很好地工作。它只需要至少Java 6

  • 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 开始)中,现代 API 是内置的。
  • 在非 Android Java 6 和 7 中获得 ThreeTen Backport,现代类的后向端口(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从org.threeten.bp子包中导入日期和时间类。

链接

于 2019-10-25T11:23:42.277 回答
2

将日期和时间字符串隐藏到毫秒:

 public static final String DATE_TIME_FORMAT = "MM/dd/yyyy HH:mm:ss a";

或者

  public static final String DATE_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss";

或者

  public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ssZZZZZ";
  //TimeZone.getAvailableIds() to list all timezone ids
  String timeZone = "EST5EDT";//it can be anything timezone like IST, GMT.
  String time = "2/21/2018 7:41:00 AM";

 public static long[] convertTimeInMillis(String dateTimeFormat, String timeZone, String... times) throws ParseException {

   SimpleDateFormat dateFormat = new SimpleDateFormat(dateTimeFormat, Locale.getDefault());
   dateFormat.setTimeZone(TimeZone.getTimeZone(timeZone));
   long[] ret = new long[times.length];
   for (int i = 0; i < times.length; i++) {
      String timeWithTZ = times[i] + " "+timeZone;
      Date d = dateFormat.parse(timeWithTZ);
      ret[i] = d.getTime();
    }
  return ret;

}

//毫秒到日期字符串

  public static String convertTimeInMillisToDateString(long timeInMillis, String DATE_TIME_FORMAT) {
     Date d = new Date(timeInMillis);
     SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
     return sdf.format(d);
  }
于 2018-02-22T20:10:40.850 回答
1

Android 26 及更高版本

Conversation from epoch to UTC date time and Device date time

public class TimeConversionUtil {

public static long getCurrentEpochUTC() {
    return Instant.now(Clock.systemUTC()).toEpochMilli();
}

public static String deviceDateTimeString(long epochMilliUtc) {
    Instant instant = Instant.ofEpochMilli(epochMilliUtc);
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd, yyyy, hh:mm:ss a", Locale.US).withZone(ZoneId.systemDefault());
    return formatter.format(instant);
}

public static String uTCDateTimeString(long epochMilliUtc) {
    Instant instant = Instant.ofEpochMilli(epochMilliUtc);
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd, yyyy, hh:mm:ss a", Locale.US).withZone(ZoneId.of("UTC"));
    return formatter.format(instant);

}

public static long convertDateStringToLongUTC(String stringUTCDate) {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd, yyyy, hh:mm:ss a", Locale.ENGLISH);
    LocalDateTime localDate = LocalDateTime.parse(stringUTCDate, formatter);
    long timeInMilliseconds = localDate.atOffset(ZoneOffset.UTC).toInstant().toEpochMilli();
    return timeInMilliseconds;
}

}

@Test
public void timeConversionTest() {
    long currentTimeUtc = Instant.now(Clock.systemUTC()).toEpochMilli();
    String utc = TimeConversionUtil.uTCDateTimeString(currentTimeUtc);
    Long utcLongTime = TimeConversionUtil.convertDateStringToLongUTC(utc);
    String utc1 = TimeConversionUtil.uTCDateTimeString(utcLongTime);
    assertTrue(utc.equalsIgnoreCase(utc1));
}
于 2019-11-20T13:51:45.727 回答
0

只是为了补充给定的答案,如果您需要将日期给出的时间转换为其他时间单位,您可以使用TimeUnit API

例子:

TimeUnit.MILLISECONDS.toMinutes(millis)
于 2018-10-25T09:33:26.740 回答