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