Android studio 将字符串转换为ANDROID中的日期格式

Android studio 将字符串转换为ANDROID中的日期格式,android-studio,simpledateformat,date-parsing,Android Studio,Simpledateformat,Date Parsing,我得到的字符串像1604341549,并希望将它们转换为正常的日期格式,如 2012年2月12日4:00。这是我的实现 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); try { Date d = sdf.parse(date); sdf.applyPattern("dd MMM yyyy hh:mm");

我得到的字符串像1604341549,并希望将它们转换为正常的日期格式,如 2012年2月12日4:00。这是我的实现

 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        try {
            Date d = sdf.parse(date);
            sdf.applyPattern("dd MMM yyyy hh:mm");
            holder.v.setText(sdf.format(d));
        } catch (ParseException ex) {
            Log.e("Exception", ex.getLocalizedMessage());
        }

我已经检查了日志,它将日期显示为try块之前的字符串,但它没有在try块中实现,而是给出了一个错误“不可解析的日期:“1604341549”。

看起来您的日期是一个以秒为单位编码时间戳的长日期,因此您不需要解析字符串,相反,您应该简单地使用
Date(longdate)
构造函数构建
Date
对象。不要忘记将秒数乘以1000将秒数转换为毫秒。看起来日期是一个以秒为单位编码时间戳的长日期,因此不需要解析字符串,而只需使用
date(long date)
构造函数构建一个
date
对象。不要忘记将秒数乘以1000,将秒数转换为毫秒 考虑使用java.time(现代java日期和时间API)进行日期和时间工作。让我们首先声明两个格式化程序,一个用于输入,另一个用于所需的输出

/** For parsing seconds since the epoch */
private static final DateTimeFormatter unixTimestampFormatter
        = new DateTimeFormatterBuilder()
                .appendValue(ChronoField.INSTANT_SECONDS)
                .toFormatter();

/** For formatting into normal date and time */
private static final DateTimeFormatter normalFormatter
        = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM)
                .withLocale(Locale.UK);
现在转换如下:

    String inputStr = "1604341549";
    Instant inst = unixTimestampFormatter.parse(inputStr, Instant.FROM);
    String normalDateTimeStr = inst.atZone(ZoneId.systemDefault())
            .format(normalFormatter);
    System.out.println(normalDateTimeStr);
输出为:

2020年11月2日19:25:49

我确信Shamm在另一个答案中是正确的:您的输入字符串包含所谓的Unix时间戳,即自1970年1月1日00:00 UTC的Unix纪元以来的秒数。使用java.time,我们可以构建一个格式化程序来解析这些数据

为了提供“正常”输出,我使用Java的内置日期和时间格式。在本例中,您可以使用UK语言环境,但对于大多数内容用户,您应该使用用户的语言环境

你的代码出了什么问题? 首先,您试图将输入字符串解析为包含年、月、日期、小时等,但它没有这样做。因此,您很幸运地得到了一个异常,因此您意识到它是错误的(
SimpleDataFormat
通常不会给出该异常,这让您相信,当它不存在时,一切都是好的)

SimpleDataFormat
将1604解析为年,34解析为月,15解析为月日,49解析为小时。然后它反对了,因为分钟(和秒)的数字已经没有了

问:java.time不需要Android API级别26吗? time在较旧和较新的Android设备上都能很好地工作。它至少需要Java6

  • 在Java8和更高版本以及更新的Android设备上(API级别26),现代API是内置的
  • 在非androidjava6和7中,获取三个后端口,即现代类的后端口(三个十用于jsr310;请参见底部的链接)
  • 在较旧的Android上,可以使用desugaring或Android版本的ThreeTen Backport。它叫ThreeTenABP。在后一种情况下,请确保使用子包从
    org.threeten.bp
    导入日期和时间类
链接
  • 解释如何使用java.time
  • ,其中首先描述了
    java.time
  • ,java.time的后端口到Java6和Java7(JSR-310为三十)
  • ,Android版Three Ten Backport
  • ,解释得非常透彻
java.time-through-desugaring 考虑使用java.time(现代java日期和时间API)进行日期和时间工作。让我们首先声明两个格式化程序,一个用于输入,另一个用于所需的输出

/** For parsing seconds since the epoch */
private static final DateTimeFormatter unixTimestampFormatter
        = new DateTimeFormatterBuilder()
                .appendValue(ChronoField.INSTANT_SECONDS)
                .toFormatter();

/** For formatting into normal date and time */
private static final DateTimeFormatter normalFormatter
        = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM)
                .withLocale(Locale.UK);
现在转换如下:

    String inputStr = "1604341549";
    Instant inst = unixTimestampFormatter.parse(inputStr, Instant.FROM);
    String normalDateTimeStr = inst.atZone(ZoneId.systemDefault())
            .format(normalFormatter);
    System.out.println(normalDateTimeStr);
输出为:

2020年11月2日19:25:49

我确信Shamm在另一个答案中是正确的:您的输入字符串包含所谓的Unix时间戳,即自1970年1月1日00:00 UTC的Unix纪元以来的秒数。使用java.time,我们可以构建一个格式化程序来解析这些数据

为了提供“正常”输出,我使用Java的内置日期和时间格式。在本例中,您可以使用UK语言环境,但对于大多数内容用户,您应该使用用户的语言环境

你的代码出了什么问题? 首先,您试图将输入字符串解析为包含年、月、日期、小时等,但它没有这样做。因此,您很幸运地得到了一个异常,因此您意识到它是错误的(
SimpleDataFormat
通常不会给出该异常,这让您相信,当它不存在时,一切都是好的)

SimpleDataFormat
将1604解析为年,34解析为月,15解析为月日,49解析为小时。然后它反对了,因为分钟(和秒)的数字已经没有了

问:java.time不需要Android API级别26吗? time在较旧和较新的Android设备上都能很好地工作。它至少需要Java6

  • 在Java8和更高版本以及更新的Android设备上(API级别26),现代API是内置的
  • 在非androidjava6和7中,获取三个后端口,即现代类的后端口(三个十用于jsr310;请参见底部的链接)
  • 在较旧的Android上,可以使用desugaring或Android版本的ThreeTen Backport。它叫ThreeTenABP。在后一种情况下,请确保使用子包从
    org.threeten.bp
    导入日期和时间类
链接
  • 解释如何使用java.time
  • ,其中首先描述了
    java.time
  • ,java.time的后端口到Java6和Java7(JSR-310为三十)
  • ,Android版Three Ten Backport
  • ,解释得非常透彻

  • 作为一个旁白,考虑扔掉长期过时和臭名昭著的麻烦<代码> SimpleDateFormat <代码>和朋友。看看是否可以使用或添加到Android项目中,以便使用java.time,即现代java日期和时间API。和你一起工作真是太好了。这能回答你的问题吗。其他一些类似的问题可以帮助你建立日期时间处理技能。