【问题标题】:Java How to create a UTC and add few ms to the same UTC objectJava 如何创建一个 UTC 并将几毫秒添加到同一个 UTC 对象
【发布时间】:2012-11-27 18:45:09
【问题描述】:
static String createUTCTime()
{
    Calendar cal = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
    cal.add(Calendar.SECOND, 10);

    SimpleDateFormat f = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss");
    f.setCalendar(cal);

    return f.format(new Date());
}

基本上我想在下面做的事情

Calendar objectX = createUTCTime();
//2012-Nov-27 18:35:40

x.addMS(10);
//2012-Nov-27 18:35:50

您如何处理 UTC 时间来操纵它们?

【问题讨论】:

  • 你想要一个字符串(用于显示)还是一个日期/日历(用于进一步操作)?它们是不同的东西。
  • 日期或日历对象 - 哪个更合适。不是字符串
  • 那么f.format(..) 应该做什么?摆脱它,您将是解决问题的好方法(或者更确切地说,您不会走得更远)。
  • addMS(10) 是假设增加 10 秒还是 10 毫秒?查看示例输出,相差 10 秒...

标签: java utc


【解决方案1】:

Date 只是一个时间点,它不包含任何时区信息。如果你想使用时区和日期,你需要Calendar

Calendar cal = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
cal.add(Calendar.SECONDS, 10);

现在是棘手的部分,您不能将其转换为 Date (cal.getTime()),因为它会丢失时区(但仍代表相同的时间点)。您应该做的是创建一个配置为使用 UTC 的 SimpleDateFormat`。

另一方面,如果您只需要几秒钟或几毫秒,Date 就可以了。请记住在正确的时区格式化。但是你不应该在几个小时内使用Date 以及以上所有内容(假设小时是 3600000 毫秒有时是错误的,因为闰秒、DST 等)

【讨论】:

  • 问题需要几毫秒;日历是否支持这种粒度? (如果是这样,更新代码可能会有用。)
  • @pst:不确定,但看看这个例子(18:35:4018:35:50),OP 似乎实际上想要秒(?)
【解决方案2】:

真的不清楚您要做什么 - 但如果您要创建一个对象以进一步使用,则不应将其转换为字符串表示形式,即SimpleDateFormat.format 做了什么。

老实说,用于处理日期和时间的 Java API 非常糟糕 - 你最好使用Joda Time。例如:

DateTime x = new DateTime(DateTimeZone.UTC);
x = x.plusMillis(10);

Joda Time 为日期和时间提供了大量 不可变 类型,它们的可读性明显优于可变的 CalendarDate 类型。此外,它还支持更多类型来表示不同类型的值。

真的,像瘟疫一样避免 java.util.Date/Calendar :)

【讨论】:

  • 解决了最初的问题,用Calender还是Date/DateTime哪个更合适?
  • @stackoverflow:这完全取决于你想要代表什么。如果它只是一个时间戳 - 一个瞬间 - 那么Date 是合适的。如果它具有关联的日历系统和时区,则使用Calendar
  • 静态字符串 createUTCTime() { DateTime x = new DateTime(DateTimeZone.UTC); return x.plusMillis(100).toString("yyyy-MMM-dd HH:mm:ss"); } ----执行此代码返回相同的时间。每次调用该方法时。知道为什么会发生这种副作用吗?
【解决方案3】:

您可以使用以下代码。

    Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
    cal.add(Calendar.MILLISECOND, 10);

    DateFormat df = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss");
    SimpleDateFormat f = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss");
    f.setTimeZone(cal.getTimeZone());
    System.out.println(f.format(cal.getTime()));

getTime 提供 Date 对象,它没有任何关于 timeZone 的信息。 By Date 对象可以在GMT(toGMTString()) 和本地时区(toLocalString()) 中显示日期。

此代码将以所需格式为您提供 UTC 时间。

【讨论】:

  • 我需要字符串看起来像这种格式 2012-Nov-27 18:35:40
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-11
  • 2017-11-07
  • 1970-01-01
  • 1970-01-01
  • 2013-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多