【问题标题】:how to add seconds to string time stamp (yyyy-mm-ddTH:i:s+tz) in java如何在java中将秒添加到字符串时间戳(yyyy-mm-ddTHH:is + tz)
【发布时间】:2016-12-02 11:46:36
【问题描述】:

我有一个名为 time 的字符串变量 2016-11-30T00:06:42+05:30

持续时间 32700545 分钟。

我想在上面的字符串时间戳中添加持续时间,并且需要计算开始时间和结束时间。

所以我想获取 StartTime:00:06 和 EndTime:09:05

我试过了,但是不行

      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");

      Date date = sdf.parse(startTime.toString());
      Timestamp ts_now = new Timestamp(date.getTime());
      System.out.println(">>>>>>"+date);
      Calendar cal = Calendar.getInstance();
      cal.setTimeInMillis(ts_now.getTime());
      cal.add(Calendar.SECOND, Integer.parseInt(Value.toString()));
      Timestamp later = new Timestamp(cal.getTime().getTime());
      System.out.println(">>>>>>"+later);

我尝试使用 X ,Z 但出现类似

的错误
Exception in thread "main" java.text.ParseException: Unparseable date: "2016-11-30T00:06:42+05:30"
    at java.text.DateFormat.parse(DateFormat.java:366)
    at oneraise.radis.thread.mavenproject1.ParseJson.main(ParseJson.java:48)

我是java新手,谁能帮帮我

谢谢

【问题讨论】:

  • 我无法使用 SimpleDateFormat 解析该字符串 (yyyy-MM-dd'T'HH:mm:ss'Z')
  • @TilakMadichetti 现在你能帮忙吗?
  • 这里的Value怎么样?
  • 值已以粗体突出显示 2016-11-30T00:06:42+05:30
  • 如果您更喜欢使用SimpleDateFormat,您可以使用X 来接受+05:30 应该匹配的ISO 8601 时区。

标签: java date timestamp simpledateformat


【解决方案1】:

tl;博士

OffsetDateTime.parse( "2016-11-30T00:06:42+05:30" )
    .plus( Duration.ofSeconds( 32_700L ) )

详情

避免麻烦和令人困惑的日期时间类,例如 java.util.DateCalendar,它们现在是遗留的,被 java.time 类所取代。

您的输入字符串符合标准ISO 8601 格式。这样的字符串可以直接被 java.time 类解析,不需要指定格式化模式。

解析为OffsetDateTime 对象。

OffsetDateTime odt = OffsetDateTime.parse( "2016-11-30T00:06:42+05:30" );

另一个答案中使用的ZonedDateTime 类在这里不合适。此输入字符串仅包含一个offset-from-UTC,而不是一个完整的时区,例如Asia/Kolkata。所以OffsetDateTime 是这里要使用的类。

Duration 类处理您的时间跨度,以秒计。

Duration d = Duration.ofSeconds( 32_700L );

添加到您的日期时间对象。

OffsetDateTime odtLater = odt.plus( d );

提示:要查看UTC 中的OffsetDateTime 值,请提取Instant

Instant instant = odt.toInstant();

数据库

对于数据库访问,您的 JDBC 4.2 兼容驱动程序可能能够通过 get/setObject 方法处理 java.time 对象。

如果是这样,则无需使用旧的 java.sql.Timestamp 类或其同级。

myPreparedStatement.setObject( … , odt );

如果没有,请使用添加到旧 date-lime 类中的新转换方法。

java.sql.Timestamp ts = java.sql.Timestamp.from( odt.toInstant() );

【讨论】:

  • 当谈到 Java 8 类时,这个答案比我的要好,感谢您的解释。如果 OP 需要 java.sql.Timestamp,那么他/她是否应该使用 new Timestamp(odt.toInstant().toEpochMilli())
  • @OleV.V.更容易调用添加到旧类的新转换方法。请参阅底部添加的“数据库”部分。
【解决方案2】:

这是您给出的字符串的格式

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
    SimpleDateFormat outputFormat = new SimpleDateFormat("HH:mm");
    Date date;
    try
    {

这里我已经解析了你给出的字符串。如果你想要当前时间,使用 date = new Date();

        date = sdf.parse("2016-11-30T00:06:42+05:30");
        System.out.println(date);
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);

我在这里添加了你的间隔

        cal.add(Calendar.SECOND, 32700);
        System.out.println(cal.getTime());
        String output = outputFormat.format(date);
        System.out.println(output);
        String output2 = outputFormat.format(cal.getTime());
        System.out.println(output2);
    }
    catch (ParseException e)
    {
        e.printStackTrace();
    }

这是输出。我在不同的时区。

2016 年 11 月 29 日星期二 13:06:42 CST

2016 年 11 月 29 日星期二 22:11:42 CST

13:06

22:11

【讨论】:

  • 谢谢,这是完美的......但它没有给我添加第二个结果,即 00:06+545 分钟=09:05
  • 那是因为如果你在 00:06 上加上 545 分钟,它不是 09:05,而是 09:11。 545分钟是9小时5分钟。您必须增加 539 分钟才能得到 09:05。
  • 抱歉错字,现在我得到了解决方案,SimpleDateFormat 的文本将具有 "yyyy-MM-dd'T'HH:mm:ssXXX" ,然后它的工作。
【解决方案3】:

如果在您的代码中我将日期格式的初始化更改为:

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");

—我将计算机的时区设置为 IST,我得到以下输出:

>>>>>>Wed Nov 30 00:06:42 IST 2016
>>>>>>2016-11-30 09:11:42.0

或者,您可以使用 Java 8 时间类,但如果您需要,请转换为旧的 Timestamp。编辑:我感谢 Basil Bourque 正确指出 OffsetDateTime 是要使用的类,以及转换为时间戳的方法。请参阅他的答案以获得完整的解释。

    Instant laterInstant = OffsetDateTime.parse(startTime.toString())
            .plusSeconds(Integer.parseInt(value.toString()))
            .toInstant();
    Timestamp ts = Timestamp.from(laterInstant);
    System.out.println(ts);

打印出来:

2016-11-30 09:11:42.0

我相信以上内容可以满足您的要求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 2019-11-06
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    • 2022-11-18
    相关资源
    最近更新 更多