【问题标题】:Timestamp comes with .0 at the end时间戳以 .0 结尾
【发布时间】:2013-07-09 09:50:22
【问题描述】:

我正在尝试在 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;
}

提前致谢!

【问题讨论】:

  • 使用准备好的语句生成 SQL 查询,NOT 字符串连接。您当前的代码受到 SQL 注入攻击。
  • 没问题,项目只在本地使用。
  • 这不是原因!使用准备好的语句应该是一种反射。
  • 好的,我会记住这一点,我会尽快修复它。这是优先考虑

标签: java string datetime spring-mvc google-visualization


【解决方案1】:

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

    Timestamp t = Your timestamp;
    SimpleDateFormat df = new SimpleDateFormat("YYYY.MM.dd HH:mm:ss");
    String s = df.format(t);

【讨论】:

  • 对于新读者,我建议您不要使用SimpleDateFormat(也不要使用Timestamp)。这些类设计不良且过时,尤其是前者,尤其是出了名的麻烦。而是使用来自java.time, the modern Java date and time APILocalDateTimeDateTimeFormatter
  • 注意格式模式字母的大小写。请再次检查小写y和大写Y之间的区别。
【解决方案2】:

您的代码包含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 变量,因此可以多次重复使用。

【讨论】:

  • 这个也可以,但我相信上面的答案更快。如果我可以将两者都作为答案,我会这样做:P
  • 对于java.time.format.DateTimeFormatter(Java 8 及更高版本),我使用yyyy-MM-dd HH:mm:ss.n 作为格式字符串。
【解决方案3】:

TL;DR

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

你的问题线

你的问题的中心在这里:

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

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

解决方案:java.time

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

暂时我假设您被 Spring queryForList() 返回的 List&lt;Map&lt;String,Object&gt;&gt; 所困扰,并且我们无法避免时间戳有 java.sql.Timestamp。如果是这样,请尽快将 Timestamp 转换为 Instant

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

使用更现代的查询工具,您可以直接从数据库中获取OffsetDateTimeInstantLocalDateTIme,并完全避免使用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

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

链接

【讨论】:

    【解决方案4】:

    试试这个单行解决方案

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

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

    String ts = row.get("timeStamp").toString();
    ts = ts.substring(0, str.indexOf('.'));
    

    【讨论】:

    • 非常感谢!下面的答案也有效,但我认为这个更快更好,因为我不必创建新的 SimpleDateFormat!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    • 1970-01-01
    • 2014-12-01
    • 2016-07-11
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多