Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在android中获得与另一时区相关的时间_Java_Android_Timezone_Jodatime - Fatal编程技术网

Java 如何在android中获得与另一时区相关的时间

Java 如何在android中获得与另一时区相关的时间,java,android,timezone,jodatime,Java,Android,Timezone,Jodatime,我想为FIFA 2014年世界杯比赛创建一个报警应用程序,其中我有一个服务器,存储巴西/英亩比赛的日期和时间,我的客户端是一个android应用程序,android设备可能有任何可能的时区,所以我的问题是我想将巴西/英亩计时转换为本地android设备使用不同的时区计时,在谷歌搜索了很多次之后,我开始了解joda数据和时间库,但是android的速度太慢了,所以请推荐适合我的代码。我和你一样面临着同样的问题 我使用SimpleDataFormat SimpleDateFormat sourceF

我想为FIFA 2014年世界杯比赛创建一个报警应用程序,其中我有一个服务器,存储巴西/英亩比赛的日期和时间,我的客户端是一个android应用程序,android设备可能有任何可能的时区,所以我的问题是我想将巴西/英亩计时转换为本地android设备使用不同的时区计时,在谷歌搜索了很多次之后,我开始了解joda数据和时间库,但是android的速度太慢了,所以请推荐适合我的代码。

我和你一样面临着同样的问题

我使用
SimpleDataFormat

SimpleDateFormat sourceFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sourceFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date parsed = format.parse("2011-03-01 15:10:37"); // => Date is in UTC now

TimeZone tz = TimeZone.getTimeZone("America/Chicago");
SimpleDateFormat destFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
destFormat.setTimeZone(tz);

String result = destFormat.format(parsed);
这可能对你有帮助

我认为这对你的工作最合适。而且它是Android API,而不是一般的Java API

在这里,我提到了一些对你的工作有用的方法:

void switchTimezone(String timezone)
转换此时间对象,使表示的时间保持不变,但改为位于不同的时区

返回当前为设备设置的时区字符串

如果您想以与时区无关的方式节省时间,可以通过
toMillis()
方法将时间转换为毫秒(UTC),然后通过
set(long millis)
方法检索时间

如果有什么不清楚的,请告诉我

更新

例如:

long timeMillis = /* get time milliseconds form the server */
Time time = new Time();
time.set(timeMillis);

/* changing time zone */
time.switchTimezone(/* your desired timezone in string format */);

/* getting time as string  */
String timeString = time.format("%Y%m%dT%H%M%S"); // you can change format as you wish

对于格式化时间,您应该在服务器中存储日期或时间戳较长的日期。如果你不想,你可以发送你的日期作为一个长从你的数据库日期生成。然后创建日历实例,如下所示:

        Calendar c = Calendar.getInstance();
        c.setTime(new Date(yourdatelong));
你可以在你的长线中增加一些常数。在java中,定义是“自1970年以来的毫秒数1/100:00:00”。例如,它在C#中是不同的(如果我记得清楚的话,从1900年1月1日开始的纳秒数)

这样,您就可以确保在所有设备中设置相同的日期。完成后,您只需将您想要的时区放入日历中即可显示本地时间


您可以有许多选项来管理时间并在这个类中显示它。

您可以使用此代码,它减去巴西和当地时区之间的时差。只需将日期对象替换为日期对象即可

//code...
yourDate.setTime(yourDate.getTime() - getDifferenceInMillis());
//code...

public int getDifferenceInMillis() {
    // Local Time
    int localMinute = Calendar.getInstance().get(Calendar.MINUTE);
    int localHour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
    int localDay = Calendar.getInstance().get(Calendar.DAY_OF_MONTH);

    // Brazil Time
    Calendar c = new GregorianCalendar(TimeZone.getTimeZone("Brazil/Acre"));
    c.setTimeInMillis(new Date().getTime());
    int brazilMinute = c.get(Calendar.MINUTE);
    int brazilHour = c.get(Calendar.HOUR_OF_DAY);
    int brazilDay = c.get(Calendar.DAY_OF_MONTH);

    // Difference between Brazil and local
    int minuteDifference = brazilMinute - localMinute;
    int hourDifference = brazilHour - localHour;
    int dayDifference = brazilDay - localDay;
    if (dayDifference != 0) {
        hourDifference = hourDifference + 24;
    }
    return (hourDifference * 60 + minuteDifference) * 60 * 1000;
}

如果日期存储在服务器时区(巴西/英亩),则应从数据库加载日期时间,将其转换为UTC时区并发送到客户端。在客户端,将UTC更改为本地时区:

服务器端:

DateTime dateOnServer = // load date from db
DateTime dateUTC = dateOnServer.withZone(DateTimeZone.UTC); // convert to UTC  
String dateAsStringUTC = dateUTC.toString("yyyy-MM-ddTHH:mm:ss");
// send 'dateAsStringUTC' to client  
String dateAsStringUTC = // receive date from server
DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-ddTHH:mm:ss"); // parser for date 
DateTime dateOnClient= dtf.parseDateTime(dateAsStringUTC); 
// 'dateOnClient' will be in client time zone 'DateTimeZone.getDefault()'
客户端:

DateTime dateOnServer = // load date from db
DateTime dateUTC = dateOnServer.withZone(DateTimeZone.UTC); // convert to UTC  
String dateAsStringUTC = dateUTC.toString("yyyy-MM-ddTHH:mm:ss");
// send 'dateAsStringUTC' to client  
String dateAsStringUTC = // receive date from server
DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-ddTHH:mm:ss"); // parser for date 
DateTime dateOnClient= dtf.parseDateTime(dateAsStringUTC); 
// 'dateOnClient' will be in client time zone 'DateTimeZone.getDefault()'


有关更多详细信息,您可以参考此链接,它将为您提供有关问题的保留信息,所做的只是以不同的方式格式化日期。它不会根据时区和夏令时变化将UTC时间转换为本地时间。“这是我的代码”:不,那不是你的代码。你已经从另一个答案复制并粘贴了它,所以你没有对原始答案进行归因。第一次我给出答案时,它是我的代码…但是当我编辑答案时,我忘了删除那一行…兄弟。别担心,这会发生,但继续回答,如果你的答案正确,我会投票支持你。你的日期是什么格式的(字符串、毫秒等?)年、月、月、小时、小时、分钟、秒作为字符串?编辑您的问题以显示示例。字符串sdate=“”+cal.get(Calendar.year)+“-”+cal.get(Calendar.MONTH)+“-”+cal.get(Calendar.MONTH)+“+cal.get(Calendar.DAY\u OF月)+”+“+cal.get(Calendar.HOUR\u OF天)++:“+cal.get(Calendar.MINUTE+”:“+cal.get(Calendar.SECOND;我指的是其中一个日期字符串的示例。另外……请编辑您的问题,而不是在注释中发布代码。您能否提供一个example@NeerajSharma是的,我会用一个例子更新我的答案!谢谢,我会尝试一下,然后返回给你一个好答案。谢谢\\回答得好..非常感谢^ ^这不是我要找的,所以我不需要了解您想做什么…您想更改日期的显示或您想更改日期?请仔细阅读问题。我提到我想更改巴西/英亩的服务器计时为带日期的本地计时。我编辑我的答案告诉我是否更好分钟差是什么?它现在还计算分钟数te差异。不需要第二个差异,因为时区仅以分钟为单位。但您的代码总是给出相同的结果-9差异我的本地时区是GMT+05:30我更改了代码,您需要再次复制;)