【问题标题】:Add minutes to timestamp将分钟添加到时间戳
【发布时间】:2016-05-02 13:39:41
【问题描述】:

我需要在时间戳中添加分钟并在此之后返回新值。时间戳取自数据库并作为字符串传递给方法,并具有以下模式:yyyy-MM-dd hh:mm:ss.SSSSSS

public static String changeCreditTimeStampMin(String tmStmp, int minutesToAdd) {

    tmStmp = tmStmp.substring(0, tmStmp.length() - 3);
    try {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS");
        java.util.Date parsedDate = dateFormat.parse(tmStmp);
        java.sql.Timestamp timestamp = new java.sql.Timestamp(parsedDate.getTime() + minutesToAdd*60*1000);
        tmStmp = timestamp.toString();
    } catch (ParseException e) {
        e.printStackTrace();
    }catch(Exception e){
        e.printStackTrace();
    }
    return tmStmp;
}

如您所见,我的逻辑使用 SimpleDateFormat,为了使用它,我必须对时间戳使用子字符串操作。我的问题,有没有更好的方法可以在不剪切时间戳字符串的情况下获得相同的结果?请注意,我的 java 版本是 1.5,我不能使用更新的版本。

【问题讨论】:

  • 看到您将时间戳作为字符串传递,不,您需要解析字符串来修改时间。你真的需要时间戳是一个字符串吗?否则在你的程序中使用它作为一个数字可能会更好,特别是如果你需要对它做更多的操作。
  • 您是担心精度损失还是操作顺序?
  • @Oebele 我不需要它作为字符串,但它是我从 DAO 类中得到的,事实上我有许多从结果集中检索为字符串的变量,所以我不去碰它类。
  • @rpy 不,我不关心精度,我可以将返回值传递回数据库查询并将其与具有初始模式的时间戳进行比较,它会正常工作。我只是想知道我是否可以在没有字符串操作(子字符串操作)的情况下使用某些东西,因为它似乎不适合我。
  • 我的意思是,如果你需要对时间戳做很多操作,最好将它转换为数字一次,当你从数据库中检索它时,继续使用它作为数字在你的程序中,只有当你再次在查询中使用它时才将其转换回字符串。

标签: java date timestamp java-5


【解决方案1】:

您的问题是您使用的是 mm。你应该使用MM。 MM 代表月份,mm 代表分钟。试试 yyyy-MM-dd HH:mm

其他方法:

static final long ONE_MINUTE_IN_MILLIS=60000;//millisecs
Calendar date = Calendar.getInstance(); 
long t=date.getTimeInMillis(); 
Date afterAddingTenMins=new Date(t + (10 *ONE_MINUTE_IN_MILLIS));

【讨论】:

    【解决方案2】:

    更好的方法?

    是的,使用 java.time 类而不是旧的旧日期时间类。

    通过将中间的空格替换为T,将您的字符串输入更改为标准 ISO 8601 格式。我假设这个字符串是为了代表 UTC 中的一个时刻。因此,附加一个Z,是 Zulu 的缩写,意思是 UTC。

    java.time 类在解析/生成字符串表示时默认使用 ISO 8601 格式。因此,无需费心定义格式化模式,直接输入 parse 方法。 Instant 代表 UTC 时间线上的一个时刻,结果离子为纳秒。

    Instant instant = Instant.parse( input );
    

    添加分钟。如果您希望在 UTC 中使用此功能,因此您不关心处理时区和夏令时 (DST) 等异常情况,请使用此 Instant 创建另一个。否则应用 w 时区获取ZonedDateTime

    long minutes = 5L;
    Instant later = instant.plus( minutes , ChronoUnit.MINUTES );
    

    提示:在您的应用周围传递这些 Instant 对象而不是字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-22
      • 1970-01-01
      • 1970-01-01
      • 2017-08-28
      • 2016-09-04
      • 2020-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多