Android将日期和时间转换为毫秒

50

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

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

我想把它转换成毫秒,但实际上我不知道这是哪种格式。请问有谁能帮我吗。

10个回答

104

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编写了基于ThreeTenBPThreeTenABP,专门为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();
}

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


4
完美的答案,适用于所有安卓平台。干得好兄弟! - Pir Fahim Shah
我从服务器API获取了一个日期和时间,尝试了以上所有答案,但都给我一个错误,即java.time.format.DateTimeParseException: Text '2021-03-05 09:18:07' could not be parsed at index 10。最后一个答案告诉我是51年前的答案,我不明白为什么。 - Adnan haider
@Adnanhaider 这个日期的格式化程序会有所不同。 - Pankaj Kumar
您可以使用代码 coreLibraryDesugaringEnabled,它提供了向后兼容性,无需第三方库。 - Bitwise DEVS

13

试试这个...

Calendar calendar = Calendar.getInstance();
calendar.set(datePicker.getYear(), datePicker.getMonth(), datePicker.getDayOfMonth(), 
             timePicker.getCurrentHour(), timePicker.getCurrentMinute(), 0);
long startTime = calendar.getTimeInMillis();

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;
    }

10

在 Kotlin 中,

只需要使用:

timeInMilSeconds = date.time

其中timeInMilSeconds表示毫秒数(var timeInMilSeconds: Long),而dateDate类型。


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);
  }

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以来的毫秒数。

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

SimpleDateFormatDateCalendar类在大多数其他答案中使用,它们设计不佳且现在已经过时。我建议您改用java.time,即现代Java日期和时间API。编辑:当问题在2013年提出时,其他答案是好的答案。只有时间在流逝,我们不应再使用SimpleDateFormatDateCalendar

问题:java.time是否需要Android API级别26?

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

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

链接


1

在 Kotlin 中尝试一下这个:

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

在Java中相同的代码,

Calendar calendar = Calendar.getInstance(); long time = calendar.getTimeInMillis();

1
安卓 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));
}

0

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

例如:

TimeUnit.MILLISECONDS.toMinutes(millis)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接