5

我正在尝试在 AnnotatedTimeLine (Google Chart) 及其 req. 为日期时间格式。当我重新格式化(以时间戳格式)从班级收到的字符串时,它给了我这个:

2013-06-28 10:08:35.0

我想要做的是最后删除 .0 。我怎样才能做到这一点?代码如下所示:

    public List<Survey> getAllSurvey(List<Status> statusList) {
    String sqlValues = "SELECT * FROM status WHERE idCategory = (SELECT idCategory FROM category WHERE name = '"
            + statusList.get(0).getCategoryName() + "');";
    List<Survey> survies = new ArrayList<Survey>();
    try {
        List<Map<String, Object>> rows = getJdbcTemplate().queryForList(
                sqlValues);
        for (Map row : rows) {
            Survey survey = new Survey();
            survey.setCategoryName(statusList.get(0).getCategoryName());
            survey.setValue((String) (row.get("value")));
            survey.setUnit((String) row.get("unit"));
            survey.setTimestamp(row.get("timeStamp") + "");
            survies.add(survey);
            System.out.println(survey.toString());
        }
    } catch (BadSqlGrammarException e) {
        e.printStackTrace();
    } catch (Exception e) {
        System.out.println(sqlValues);
        e.printStackTrace();
    }
    return survies;
}

提前致谢!

4

4 回答 4

2

您必须将时间戳转换为您想要在课堂上使用的日期格式。的默认字符串表示Timestamp在末尾包括纳秒。如果你想改变它,你可以随时这样做:

    Timestamp t = Your timestamp;
    SimpleDateFormat df = new SimpleDateFormat("YYYY.MM.dd HH:mm:ss");
    String s = df.format(t);
于 2013-07-09T09:58:57.810 回答
1

您的代码包含row.get("timeStamp") + ""将有效调用的行row.get("timeStamp").toString() + ""。假设该行包含一个java.sql.Timestamp对象,它将返回格式如下的时间戳yyyy-mm-dd hh:mm:ss.fffffffff

如果不需要,请创建一个SimpleDateFormat对象来表示所需的格式,然后调用SimpleDateFormat#format(row.get("timeStamp"))以正确格式化您的值。

该类SimpleDateFormat描述了如何定义您的日期和时间模式。确保SimpleDateFormat只创建一次对象,因为创建它相对昂贵。许多人将其定义为private static final变量,因此可以多次重用。

于 2013-07-09T09:59:30.313 回答
1

TL;博士

  1. 您似乎混淆了您应该尝试区分的两件事:时间戳的值及其格式。
  2. 您不应该希望使用Timestamp该类。它设计得很糟糕,而且已经过时了。而是使用OffsetDateTime,InstantLocalDatetime来自 java.time。
  3. 同样在您的Survey班级中,不要将时间戳保留为String. 仍然使用提到的 java.time 类之一。只有当您需要给出字符串输出时,才格式化成所需格式的字符串。为此,根据您需要的字符串,您可能会比仅仅避免.0最后的字符串做得更好。

你的问题线

你的问题的中心在这里:

        survey.setTimestamp(row.get("timeStamp") + "");

您正在连接Timestamp来自查询的 a 和 a String。为了做到这一点,Java通过调用它的方法也将其转换Timestamp为 a 。返回一个在秒上至少有一位小数的字符串(如果有更多的非零小数,则返回更多,最多为 9)。StringtoStringTimestamp.toString()

解决方案:java.time

时间戳表示(表示)一个时间点。用于某个时间点的最佳类Instant来自 java.time。因此,在您的Survey班级中,将时间戳定义为Instant.

有一刻我假设你被List<Map<String,Object>>SpringqueryForList()返回的那个困住了,我们无法避免时间戳有一个java.sql.Timestamp. 如果是这样,请在掌握它后立即将其转换为TimestampInstant

        survey.setTimestamp(((Timestamp) row.get("timeStamp")).toInstant());

使用更现代的查询工具,您可以直接从数据库中获取 a OffsetDateTime、 anInstant或 aLocalDateTIme并完全避免使用Timestamp该类。

如何将您的Instant(或其他 java.time 对象)格式化为字符串以呈现给用户或与另一个系统进行交换,这在很大程度上取决于上下文和要求。这里只是一个简单的例子:

    DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM);
    String formattedTimestamp = survey.getTimetamp()
            .atZone(ZoneId.systemDefault())
            .format(formatter);
    System.out.println(formattedTimestamp);

示例输出:

2020 年 9 月 13 日下午 2:26:40

示例代码的输出不仅取决于时区,还取决于语言环境。

链接

于 2021-04-29T18:35:01.523 回答
0

试试这个单行解决方案

survey.setTimestamp(row.get("timeStamp").toString().replaceAll("\\.\\d+", ""));

如果性能很关键,那么这个解决方案会更好

String ts = row.get("timeStamp").toString();
ts = ts.substring(0, str.indexOf('.'));
于 2013-07-09T10:03:50.923 回答