Java 将本地时间转换为UTC,反之亦然

Java 将本地时间转换为UTC,反之亦然,java,android,time,Java,Android,Time,我正在开发Android应用程序,我想将本地时间(设备时间)转换为UTC,并将其保存在数据库中。从数据库中检索后,我必须再次转换它并显示在设备的时区中。有人能建议如何在Java中执行此操作吗?Time.getCurrentTimezone() 会告诉你时区和时间 Calendar c=Calendar.getInstance(); int seconds=c.get(Calendar.SECOND) 将以秒为单位获取UTC时间。当然,您可以更改该值以在另一个单位中获取该值。您可以尝试以下方法将其

我正在开发Android应用程序,我想将本地时间(设备时间)转换为UTC,并将其保存在数据库中。从数据库中检索后,我必须再次转换它并显示在设备的时区中。有人能建议如何在Java中执行此操作吗?

Time.getCurrentTimezone()

会告诉你时区和时间

Calendar c=Calendar.getInstance();
int seconds=c.get(Calendar.SECOND)


将以秒为单位获取UTC时间。当然,您可以更改该值以在另一个单位中获取该值。

您可以尝试以下方法将其插入到DB中:

    SimpleDateFormat f = new SimpleDateFormat("h:mm a E zz");
    f.setTimeZone(TimeZone.getTimeZone("UTC"));
    System.out.println(f.format(new Date()));
    String dd = f.format(new Date());
此选项来自您的评论:

输出:

String dd = f.format(new Date());

        Date date = null;
        DateFormat sdf = new SimpleDateFormat("h:mm a E zz");
        try {
            date = sdf.parse(dd);
        }catch (Exception e){

        }
        sdf.setTimeZone(TimeZone.getTimeZone("Asia/Kolkata"));
        System.out.println(sdf.format(date));
UTC星期一下午1:43

为此,->再次转换并在设备的时间内显示

更新:

String dd = f.format(new Date());

        Date date = null;
        DateFormat sdf = new SimpleDateFormat("h:mm a E zz");
        try {
            date = sdf.parse(dd);
        }catch (Exception e){

        }
        sdf.setTimeZone(TimeZone.getTimeZone("Asia/Kolkata"));
        System.out.println(sdf.format(date));
输出:

String dd = f.format(new Date());

        Date date = null;
        DateFormat sdf = new SimpleDateFormat("h:mm a E zz");
        try {
            date = sdf.parse(dd);
        }catch (Exception e){

        }
        sdf.setTimeZone(TimeZone.getTimeZone("Asia/Kolkata"));
        System.out.println(sdf.format(date));
周一格林尼治标准时间下午7:30+05:30


你可以这样显示

我使用这两种方法将本地时间转换为GMT/UTC,反之亦然,这对我来说没有任何问题

public static Date localToGMT() {
    Date date = new Date();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
    sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
    Date gmt = new Date(sdf.format(date));
    return gmt;
}
将要转换为设备本地时间的GMT/UTC日期传递给此方法:

public static Date gmttoLocalDate(Date date) {

    String timeZone = Calendar.getInstance().getTimeZone().getID();
    Date local = new Date(date.getTime() + TimeZone.getTimeZone(timeZone).getOffset(date.getTime()));
    return local
}
获取当前UTC:

public String getCurrentUTC(){
        Date time = Calendar.getInstance().getTime();
        SimpleDateFormat outputFmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        outputFmt.setTimeZone(TimeZone.getTimeZone("UTC"));
        return outputFmt.format(time);
}

已接受答案的简化和浓缩版本:

public static Date dateFromUTC(Date date){
    return new Date(date.getTime() + Calendar.getInstance().getTimeZone().getOffset(new Date().getTime()));
}

public static Date dateToUTC(Date date){
    return new Date(date.getTime() - Calendar.getInstance().getTimeZone().getOffset(date.getTime()));
}
试试这个:
//将UTC转换为本地格式

 public Date getUTCToLocalDate(String date) {
            Date inputDate = new Date();
            if (date != null && !date.isEmpty()) {
                @SuppressLint("SimpleDateFormat") SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
                simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
                try {
                    inputDate = simpleDateFormat.parse(date);
                } catch (ParseException e) {
                    e.printStackTrace();
                }
            }
            return inputDate;
        }  
//将本地日期转换为UTC

public String getLocalToUTCDate(Date date) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    calendar.setTimeZone(TimeZone.getTimeZone("UTC"));
    Date time = calendar.getTime();
    @SuppressLint("SimpleDateFormat") SimpleDateFormat outputFmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
    outputFmt.setTimeZone(TimeZone.getTimeZone("UTC"));
    return outputFmt.format(time);
}
试试这个

DateFormat formatterIST = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
        formatterIST.setTimeZone(TimeZone.getTimeZone("Asia/Kolkata"));
        Date dateobj = new Date();
        Date date = formatterIST.parse(formatterIST.format(dateobj));
        System.out.println(formatterIST.format(date));

        DateFormat formatterUTC = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
        formatterUTC.setTimeZone(TimeZone.getTimeZone("UTC")); // UTC timezone
        System.out.println(formatterUTC.format(date));
java.time 现代方法使用java.time;几年前的类取代了糟糕的日期时间类,如
date
Calendar

捕获UTC中显示的当前时刻

OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ;
使用JDBC 4.2或更高版本的驱动程序投诉存储在数据库中

myPreparedStatement( … , odt ) ;
从数据库中检索

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
调整到一个时区

ZoneId z = ZoneId.systemDefault() ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;
生成要呈现给用户的文本

DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL ).withLocale( Locale.getDefault() ) ;
String output = zdt.format( f ) ;

对于版本26之前的早期Android,使用ThreeTenABP库获取大部分java.time功能,这些功能在ThreeTen Backport项目中被后移植到java 6和java 7。

假设今天的日期是星期一下午5:34(IST),那么如何获得星期一下午12:04(UTC)这样的日期在需要转换的时候,你真的有权访问一个时间对象吗?还是只有一个字符串?我只有一个string@Dyo这会帮助你解决你的问题。当试图再次转换时,它显示空指针异常。不可能,我已经尝试过了,效果很好。你能给我你的应用的堆栈跟踪吗?刚初始化的Date=new Date()和它的工作状态很好。谢谢。new Date(String Date)不推荐使用。你不应该使用它!您可以使用DateFormat.parse(字符串日期)而不是new date(字符串日期),因为它已被弃用。是的,这是一个简单的一行正确答案,好朋友。但时区#getOffset()接受UTC时间…我建议进行编辑,但已被拒绝,第一个函数(即
dateFromUTC
)存在错误。如果输入的
date
参数是UTC,我们必须添加本地时间的时差以达到本地时间。然后它必须是这样的
返回新日期(Date.getTime()+Calendar.getInstance().getTimeZone().getOffset(new Date().getTime())