Java 如何在没有SimpleDateFormat的情况下获取UTC时间?

Java 如何在没有SimpleDateFormat的情况下获取UTC时间?,java,datetime,utc,Java,Datetime,Utc,我目前正在研究从UTC转换为UTC的时间戳。我找到的所有文章都是基于字符串之间的转换 但我想知道是否有一种方法可以简单地使用日期实例/类或日历将本地日期转换为UTC,反之亦然,而不将其转换为介于两者之间的字符串。也许这可以帮助您: Calendar.getInstance(java.util.TimeZone) Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC")); 仔细阅读。与java date和cale

我目前正在研究从UTC转换为UTC的时间戳。我找到的所有文章都是基于字符串之间的转换


但我想知道是否有一种方法可以简单地使用日期实例/类或日历将本地日期转换为UTC,反之亦然,而不将其转换为介于两者之间的字符串。

也许这可以帮助您:

Calendar.getInstance(java.util.TimeZone)

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

仔细阅读。与java date和calendar类相比,这是一个更好的API。java.until.date没有时区,因此不需要进行任何转换。只有在使用toString方法显式或隐式地将日期格式化为字符串时,才能看到时区。隐式转换使用本地默认时区

在内部,Date将日期/时间存储为long,表示自UTC 1970年1月1日午夜以来的毫秒数


因此,如果将日期格式化为字符串,然后将字符串解析回日期,则根本没有任何更改。

到目前为止,我还没有找到一个完美的解决方案,因此我必须坚持将日期转换为字符串,反之亦然。这是我写的一个小助手类

public class DateTimeHelper {

    public static final String MYSQL_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
    private static final TimeZone timeZoneUTC = TimeZone.getTimeZone("UTC");

    private Date date = new Date();
    private final SimpleDateFormat format;

    public DateTimeHelper(String dateTimeFormat) {
        format = new SimpleDateFormat(dateTimeFormat, Locale.US);
    }

    public DateTimeHelper(String dateTimeFormat, String utcTimeString) {
        this(dateTimeFormat);

        try {
            format.setTimeZone(timeZoneUTC);
            Date utc = format.parse(utcTimeString);
            format.setTimeZone(TimeZone.getDefault());
            String local = format.format(utc);
            date = format.parse(local);
        } catch (ParseException e) {
            // nothing
        }
    }

    public Date getDate() {
        return date;
    }

    public Date toUtc() {

        String temp = toString();
        format.setTimeZone(timeZoneUTC);
        try {
            return format.parse(temp);
        } catch (ParseException e) {
            return date;
        }
    }

    @Override
    public String toString() {
        format.setTimeZone(TimeZone.getDefault());
        return format.format(date);
    }

    public String toUtcString() {
        format.setTimeZone(timeZoneUTC);
        return format.format(date);
    }
}
还有一个更容易使用:

public class MySqlDateTimeHelper extends DateTimeHelper {

    public MySqlDateTimeHelper() {
        super(DateTimeHelper.MYSQL_DATE_TIME_FORMAT);
    }

    public MySqlDateTimeHelper(String utcTimeString) {
        super(DateTimeHelper.MYSQL_DATE_TIME_FORMAT, utcTimeString);
    }

    public static String getCurrentTimestampUtc() {
        MySqlDateTimeHelper current = new MySqlDateTimeHelper();
        return current.toUtcString();
    }
}

但是,如何使用两个日历实例(UTC和local)在日期之间进行转换呢。伟大的该帖子使用SimpleDateTimeFormat,它实际上是从日期到字符串的转换,反之亦然。我只是不明白为什么日期/时间转换是通过将日期转换成字符串,然后再转换回日期来完成的。唯一没有使用SimpleDataFormat的。我希望你能向我道歉。当我还在使用Java 7时,它也在使用Java 8。无论如何,第二个答案是很好的,因为它使用了尽可能长的偏移量。请参见,麻烦的旧日期时间类,例如,和
java.text.simpleDataFormat
,现在被内置在java 8和java 9中的类所取代。看见这里的解决方案很简单:
Instant.now()
FYI,项目现在开始了,团队建议迁移到类。请参见.FYI,诸如和
java.text.simpleDataFormat
之类的麻烦的旧日期时间类现在被内置于Java8和Java9中的类所取代。看见
public class MySqlDateTimeHelper extends DateTimeHelper {

    public MySqlDateTimeHelper() {
        super(DateTimeHelper.MYSQL_DATE_TIME_FORMAT);
    }

    public MySqlDateTimeHelper(String utcTimeString) {
        super(DateTimeHelper.MYSQL_DATE_TIME_FORMAT, utcTimeString);
    }

    public static String getCurrentTimestampUtc() {
        MySqlDateTimeHelper current = new MySqlDateTimeHelper();
        return current.toUtcString();
    }
}