当前位置: 首页 > 知识库问答 >
问题:

尝试使用java为android聊天创建时间戳“mm/dd/yyyy hh: mm a”

齐财
2023-03-14

我正在尝试创建格式为“mm/dd/yyyy hh:mm a”的时间戳。我的应用程序最初崩溃了,但我尝试了不同的方法,它不再崩溃,但在聊天屏幕上显示“java.text.SimpleDateFormat@4f47c0fb“而不是时间戳。

以下是聊天屏幕时间戳的屏幕截图

这是来自我的适配器聊天.java文件

    @Override
public void onBindViewHolder(@NonNull MyHolder myHolder, int i) {
    //Get data
    String message = chatList.get(i).getMessage();
    String timeStamp = chatList.get(i).getTimestamp();

    //Convert time stamp to mm/dd/yyyy hh:mm am/pm
    //Calendar cal = Calendar.getInstance(Locale.ENGLISH);
    //cal.setTimeInMillis(Long.parseLong(timeStamp));
    String dateTime = new SimpleDateFormat("MM/dd/yyyy hh:mm a", Locale.getDefault()).toString();


    //Set data
    myHolder.messageTv.setText(message);
    myHolder.timeTv.setText(dateTime);
    try {
        Picasso.get().load(imageUrl).into(myHolder.profileIv);
    } catch (Exception e) {

    }

    //Set seen/delivered status of message
    if (i == chatList.size() - 1) {
        if (chatList.get(i).isSeen()) {
            myHolder.isSeenTv.setText("Seen");
        }
        else {
            myHolder.isSeenTv.setText("Delivered");

        }

    }
    else {
        myHolder.isSeenTv.setVisibility(View.GONE);
    }
}

我注释掉了导致它崩溃的2行代码,并在它下面尝试了新方法。有人可以指导我朝着正确的方向前进吗?我不确定我做错了什么。任何帮助将不胜感激。谢谢!

共有2个答案

王修为
2023-03-14

您必须使用toLocalizedPattern()代替toString()

String dateTime = new SimpleDateFormat("mm/dd/yyyy hh:mm a", Locale.getDefault()).toString();

也就是说,你必须这样使用它。

String dateTime = new SimpleDateFormat("mm/dd/yyyy hh:mm a", Locale.getDefault()).toLocalizedPattern();
凌嘉勋
2023-03-14

关于你的问题,不止一个不清楚的观点,但我正在尝试一个建议。对于我的方式,我需要两个格式化程序:

private static DateTimeFormatter timestampFormatter = new DateTimeFormatterBuilder()
        .appendValue(ChronoField.INSTANT_SECONDS)
        .appendValue(ChronoField.MILLI_OF_SECOND, 3)
        .toFormatter();

private static DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm a");

我知道chatList.get(i). getTimestamp()可能会返回null,但在这种情况下,您没有任何聊天消息要显示。我们需要考虑这种可能性。下面的代码将为您提供字符串NA。如果您想要其他东西,请进行修改。接下来,从您的注释掉的代码(在null上崩溃的代码)来看,它可能还会返回一个String,其中包含自纪元以来的长毫秒数。所以我也在处理这种情况。

    int i = 0;
    String timeStamp = chatList.get(i).getTimestamp();

    String dateTime;
    if (timeStamp == null) {
        dateTime = "NA";
    } else {
        Instant inst = timestampFormatter.parse(timeStamp, Instant.FROM);
        dateTime = inst.atZone(ZoneId.systemDefault()).format(dtf);
    }

    System.out.println(dateTime);

在我的时区(欧洲/哥本哈根)中,当聊天列表(i).get(i)返回时间戳()时的示例输出1567890123456

09/07/2019 11:02 下午

第一种情况,当时间戳为空并且您尝试长解析长(时间戳)时,您将获得一个 java.lang.数字格式异常:空。如果您的代码未捕获此异常,则会崩溃。

第二种情况,您正在调用SimpleDateFormattoString方法。SimpleDateFormat没有html" target="_blank">定义toString方法本身,因此调用了Object.toStrng()。这将返回一个字符串,如java.text.SimpleDateFormat@4f47c0fb。类名和一个有趣的十六进制值由@符号分隔。

但是,您可能根本不想使用SimpleDateFormat。那个类是臭名昭著的麻烦制造者,而且早就过时了。相反,在我的代码中,我使用了DateTimeForware和java.time的其他类,现代Java日期和时间API。

java.time在新旧Android设备上都运行良好。只不过要求至少Java 6。

  • 在Java8和更高版本中,以及在更新的Android设备上(API级别26),现代API是内置的。在这种情况下,您需要替换常量Instant。上述代码中的FROM,方法引用Instant::FROM
  • 在非Android Java 6和7中,获取ThreeTen Backport,即现代类的Backport(JSR 310为ThreeTene;请参阅底部的链接)
  • 在(较旧的)Android上,使用Android版本的ThreeTen Backport。它被称为ThreeTenABP。并确保从org.threeten导入日期和时间类。带有子包的bp
  • 甲骨文教程:日期时间,说明如何使用 java.
  • Java 规范请求 (JSR) 310,其中首次描述了 java.time
  • 三十个向后移植项目,将 java.time 向后移植到 Java 6 和 7(三十个用于 JSR-310)。
  • 三天ABP,Android版三十号回港
  • 问:如何在Android项目中使用三张ABP,并给出一个非常透彻的解释。
 类似资料:
  • 问题内容: 在python中,日期似乎是一件棘手的事情,而从pandas TimeStamp中剥离日期却给我带来了很多麻烦。我想简单地 我有一个带有Created_date列的数据框: 我已尝试在该系列上应用该方法,例如:,但出现错误 有人可以帮我吗? 问题答案: 在元素上: 您可以通过调用组成的元素的方法来获取原始对象: 然而, 另一种 方式,你可以做到这一点是通过调用未绑定方法: 此方法最快,

  • 如果我将视图更改为不强制转换,我不会得到错误,但结果是错误的。 有人知道我如何将这个日期格式化为这个特定的模式吗?我尝试使用TimeStamp、java.sql.date等,但没有任何效果...

  • 本文向大家介绍js时间戳转yyyy-MM-dd HH-mm-ss工具类详解,包括了js时间戳转yyyy-MM-dd HH-mm-ss工具类详解的使用技巧和注意事项,需要的朋友参考一下 在web开发中,我们经常需要用js将时间戳转yyyy-MM-dd HH-mm-ss类似的格式,这样才适合我们的观感,那么我们该如何在js中将时间戳转换成这种格式呢?其实很简单,我们开发一个时间戳工具类,如下: 第一种

  • 问题内容: 我希望将日期格式更改为MM / DD / YYYY,当前为YYYY / MM / DD。 我尝试进行研究,但具有讽刺意味的是,情况总是相反。现在有人可能会说将其向后尝试从那里开始尝试,但没有成功。 我上课的所有事情: 顺便说一下,我不熟悉的简单日期格式类和日期格式类,并且尝试实现它们均未成功。 问题答案: 只需使用即可转换为。无需麻烦的API。 而是在整个代码中使用此对象。每当您需要将

  • 问题内容: 我正在尝试从Netezza将具有格式的记录插入Oracle,但是我得到的日期类型无效。 我该如何做到这一点? 问题答案: http://www.sqlfiddle.com/#!4/22115/1

  • 我想存储和查看格式为yyyy-mm-dd HH: mmZ的时间戳列。我对cqlshrc文件中的dattimeform进行了更改,并将其存储在home下的. cassandra文件夹中。以下是我所做的更改: 所以在cql中我创建了一个简单的临时表,如下所示: 现在,当我做: 我得到错误: 无效请求:来自服务器的错误:代码=2200[无效查询]消息="无法将'1997-21-01 00:01Z'强制到