Java-将当前日期转换为UTC和任意时区的UTC

Java-将当前日期转换为UTC和任意时区的UTC,java,timezone,Java,Timezone,我需要两样东西: 将当前时间转换为UTC(以便以UTC格式存储日期) -->result=java.util.Date. 将加载的日期(UTC格式)转换为任意时区-->结果= java.util.Date或毫秒 因为这两点都要记住日光 (一) 我在stackoverflow上发现以下内容: Calendar c = Calendar.getInstance(); System.out.println("current: "+c.getTime()); TimeZone z = c.getTim

我需要两样东西:

  • 将当前时间转换为UTC(以便以UTC格式存储日期) -->result=java.util.Date.

  • 将加载的日期(UTC格式)转换为任意时区-->结果= java.util.Date或毫秒

  • 因为这两点都要记住日光

    (一) 我在stackoverflow上发现以下内容:

    Calendar c = Calendar.getInstance();
    System.out.println("current: "+c.getTime());
    
    TimeZone z = c.getTimeZone();
    int offset = z.getRawOffset();
    if(z.inDaylightTime(new Date())){
        offset = offset + z.getDSTSavings();
    }
    int offsetHrs = offset / 1000 / 60 / 60;
    int offsetMins = offset / 1000 / 60 % 60;
    
    System.out.println("offset: " + offsetHrs);
    System.out.println("offset: " + offsetMins);
    
    c.add(Calendar.HOUR_OF_DAY, (-offsetHrs));
    c.add(Calendar.MINUTE, (-offsetMins));
    
    System.out.println("GMT Time: "+c.getTime());
    
    -->结果等于UTC

    (二)

    -->我有个问题

    在我的示例中,我将时区“欧洲/维也纳”(使用日光)的日期作为utc存储到数据库中。 欧罗巴/维也纳-->10:00 UTC-->09:00


    现在我想把这个UTC(09:00)转换成“欧洲/维也纳”,我得到:09:00=我损失了一个小时。

    你想过像这样使用现有的DateTime API吗

    更新

  • 已经答复:

  • 也一样,我想只需使用
    withZone

  • 请尝试以下代码(我使用的是Joda Time)在时区之间转换日期:

    public static Date convertDate(Date sourceDate, DateTimeZone sourceTimeZone, DateTimeZone resultTimeZone) {
        LocalDateTime localDateTime = new LocalDateTime(date.getTime());
        DateTime sourceDateTime = localDateTime.toDateTime(sourceTimeZone);
        DateTime resultDateTime = sourceDateTime.withZone(resultTimeZone);
        return resultDateTime.toLocalDateTime().toDateTime().toDate();
    }
    
    转换为UTC可以简化为:

    public static Date toUtcDate(Date sourceDate, DateTimeZone sourceTimeZone) {
        return convertDate(sourceDate, sourceTimeZone, DateTimeZone.UTC);
    }
    
    此呼叫成功为我增加1小时:

    convertDate(new Date(), DateTimeZone.UTC, DateTimeZone.forID("Europe/Vienna"));
    

    我同意C.Vogel-Joda时间对于这些要求来说非常好。你能给我一个Joda的解决方案吗?看看我的第二个帖子-毫秒不受“withZone”的影响:(我试过使用你的方法。首先我从“ToutDate”得到utc日期,但它没有返回正确的值(+1小时).之后我尝试了“convertDate”,但它与我尝试的目标时区没有区别-我总是得到相同的日期返回。我现在明白了..确定它有效,会很快更新答案Well now“convertDate”提供+1小时的日期..可能是日光问题?这一行是我脑海中的问题:LocalDateTime LocalDateTime=new LocalDateTime(date.getTime());因为sourceDate始终是UTC日期,为什么我要使用本地日期?如果我们返回java.util.date,此对象的时区将重置为本地时区?可能是
    convertDate(new Date(), DateTimeZone.UTC, DateTimeZone.forID("Europe/Vienna"));