0
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 时间来操纵它们?

4

3 回答 3

4

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

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

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

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

于 2012-11-27T18:49:55.400 回答
2

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

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

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

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

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

于 2012-11-27T18:48:49.677 回答
1

您可以使用以下代码。

    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-11-27T19:04:46.447 回答