在java中生成UTC时间

时间:2010-07-29 19:46:09

标签: java datetime date

我希望将Java 01/01/2100的UTC时间设置为'2100-01-01 00:00:00'。我正在收到“2100-01-01 00:08:00”。任何想法,如何纠正这一点。

public Date getFinalTime() {
    Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));

    DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
    Date finalTime = null;

    try
    {
        finalTime = df.parse("01/01/2100");            
    } catch (ParseException e)
    {
        e.printStackTrace();
    }

    calendar.setTime(finalTime);
    return calendar.getTime();
}

5 个答案:

答案 0 :(得分:9)

您还需要为SimpleDateFormat指定时区 - 目前正在解析午夜本地时间,最后是UTC时间上午8点。

TimeZone utc = TimeZone.getTimeZone("UTC");
Calendar calendar = Calendar.getInstance(utc);

DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
df.setTimeZone(utc);
Date finalTime = null;

try
{
    finalTime = df.parse("01/01/2100");            
} catch (ParseException e)
{
    e.printStackTrace();
}

calendar.setTime(finalTime);

与以往一样,我个人建议使用Joda Time,这通常更有能力。如果你愿意,我很乐意把你的例子翻译成Joda Time。

此外,我发现您正在返回calendar.getTime() - 这与您在计算后立即返回finalTime一样。

最后,只是抓住一个ParseException并继续进行,好像它没有发生是一个非常糟糕的主意。我希望这只是示例代码,它并不反映您的真实方法。同样地,我假设真的你将解析其他一些文本 - 如果你不是,那么正如Eyal所说,你应该直接在Calendar上调用方法。 (或者,再次使用Joda Time。)

答案 1 :(得分:3)

java.util 日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用它们并切换到 modern Date-Time API*

此外,下面引用的是 Home Page of Joda-Time 处的通知:

<块引用>

请注意,从 Java SE 8 开始,要求用户迁移到 java.time (JSR-310) - JDK 的核心部分,取代了该项目。

使用现代 API java.time 的解决方案:

import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        String strDate = "01/01/2100";
        DateTimeFormatter dtfInput = DateTimeFormatter.ofPattern("d/M/u", Locale.ENGLISH);
        
        ZonedDateTime zdt = LocalDate.parse(strDate, dtfInput)
                                .atStartOfDay(ZoneId.of("Etc/UTC"));

        // Default format
        System.out.println(zdt);

        // Getting and displaying LocalDateTime
        LocalDateTime ldt = zdt.toLocalDateTime();
        System.out.println(ldt);

        // A custom format
        DateTimeFormatter dtfOutput = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss", Locale.ENGLISH);
        // Alternatively dtfOutput.format(ldt);
        String formatted = dtfOutput.format(zdt);
        System.out.println(formatted);
        
        // Converting to some other types
        OffsetDateTime odt = zdt.toOffsetDateTime();
        Instant instant = zdt.toInstant();
        System.out.println(odt);
        System.out.println(instant);
    }
}

输出:

2100-01-01T00:00Z[Etc/UTC]
2100-01-01T00:00
2100-01-01 00:00:00
2100-01-01T00:00Z
2100-01-01T00:00:00Z

ONLINE DEMO

输出中的 Z 是零时区偏移的 timezone designator。它代表祖鲁语并指定 Etc/UTC 时区(时区偏移为 +00:00 小时)。

注意: 没有时区名称或时区偏移的日期-时间应由 LocalDateTime 表示(用于通常不使用时区信息表示的事件)。从这个意义上说,LocalDateTime 在这种情况下是无用的,您应该使用 ZonedDateTime 本身或 InstantOffsetDateTime。如果您正在处理 JDBC,我建议您还检查 this answerthis answer

modern Date-Time API 中详细了解 java.timeTrail: Date Time*


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

答案 2 :(得分:2)

您还需要设置SimpleDateFormat对象的时区,否则它将采用默认时区。

无论如何,在您的情况下,似乎仅使用日历就足够了。使用其setter为所有字段(年,月,日,小时等)设置正确的值,然后检索时间。

答案 3 :(得分:1)

java.time

与 Arvind Kumar Avinash 一样,我非常明确地建议您使用 java.time,现代 Java 日期和时间 API,用于您的日期和时间工作。如果您想要的是固定(恒定)日期和时间,请使用 addPostEdited

connect

输出:

<块引用>

2100-01-01T00:00Z

尾随的 OffsetDateTime.of() 表示 UTC。

教程链接

Oracle tutorial: Date Time 解释如何使用 java.time。

答案 4 :(得分:0)

TimeZone utc = TimeZone.getTimeZone("UTC");
Calendar calendar = Calendar.getInstance(utc);

DateFormat dateformat = new SimpleDateFormat("dd/MM/yyyy");
dateformat.setTimeZone(utc);

需要设置时区。