【问题标题】:How to get time with respect to another timezone in android [duplicate]如何在android中获取另一个时区的时间[重复]
【发布时间】:2014-07-21 01:17:21
【问题描述】:

我想为 FIFA 2014 世界杯比赛创建一个警报应用程序,其中我有一个服务器,用于存储巴西/英亩比赛的日期和时间,我的客户端是一个 android 应用程序,一个 android 设备可能有任何可能的时区,所以我的问题是我想将巴西/英亩时间转换为具有不同时区的本地 android 设备时间,经过大量谷歌搜索后,我开始了解 joda 数据和时间库,但它在 android 中太慢了所以请建议任何对我有用的代码。

【问题讨论】:

  • 您的日期采用什么格式(字符串、毫秒等?)
  • 年,monthOfYear,dayOfMonth,hourOfDay,minuteOfHour,secondOfMinute
  • 那么作为字符串?编辑您的问题以显示示例。
  • String sdate=""+cal.get(Calendar.YEAR)+"-"+cal.get(Calendar.MONTH)+"-"+cal.get(Calendar.DAY_OF_MONTH)+" "+cal.get(Calendar.HOUR_OF_DAY)+":"+cal.get(Calendar.MINUTE)+":"+cal.get(Calendar.SECOND);
  • 我的意思是日期字符串之一的示例。另外...编辑您的问题,而不是在评论中发布代码。

标签: java android timezone jodatime


【解决方案1】:

在我看来,Time class 最适合您的工作。它也是 Android API 不是通用 Java API。

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

void switchTimezone(String timezone)

转换此时间对象,使表示的时间保持不变,但位于不同的时区。

static String getCurrentTimezone()

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

如果您想以独立于时区的方式保存时间,您可以通过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

Here is a table 用于格式化时间

【讨论】:

  • 你能举个例子回答吗
  • @NeerajSharma 是的,我会用一个例子来更新我的答案!
  • 谢谢,我会尽快回复你
  • 很好的答案。谢谢
  • \\很好的答案..非常感谢^_^
【解决方案2】:

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

//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;
}

【讨论】:

  • 那么细微的差别呢??
  • 它现在还计算分钟差。不需要秒差,因为时区仅以分钟计。
  • 但是你的代码总是给出相同的结果 -9 差异我的本地时区是 GMT+05:30
  • 我改了代码,你需要再复制一次;)
【解决方案3】:

如果日期存储在服务器时区(巴西/英亩)中,您应该从数据库加载日期时间,将其转换为 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()'

【讨论】:

    【解决方案4】:

    您应该在您的服务器中存储具有长或时间戳的日期。如果您不希望,无论如何您都可以将您的日期作为数据库日期的长生成来发送。然后像这样创建您的日历实例:

            Calendar c = Calendar.getInstance();
            c.setTime(new Date(yourdatelong));
    

    你可能不得不在你的 long 中相乘并添加一些常数。在 java 中,定义是“自 1970 年 1/1 00:00:00 以来的毫秒数”。它在 C# 中有所不同,例如(从 1900 年 1 月 1 日开始的纳秒数,如果我没记错的话)。

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

    http://developer.android.com/reference/java/util/Calendar.html

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

    【讨论】:

    • 这不是我要找的
    • 该死的,所以我不明白你想做什么......你想改变你的日期显示还是你想改变你的日期?
    • 仔细阅读问题。我提到我想将巴西/英亩的服务器时间更改为带有日期的本地时间。
    • 我编辑我的答案告诉我它是否更好
    【解决方案5】:

    我遇到了和你一样的问题...

    我使用SimpleDateFormat得到了解决方案

    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);
    

    这可能对你有帮助..

    【讨论】:

    • 更多细节你可以参考这个链接SimpleDateFormat它会给你关于你的问题的详细信息
    • 所做的只是以不同的方式格式化日期。它不会根据时区和夏令时的变化将 UTC 时间转换为本地时间。
    • "there is my code":不,那不是你的代码。您已经从 SO 上的另一个答案复制并粘贴了它,并且您没有归因于原始答案。
    • 我第一次给出答案时是我的代码...但是当我编辑答案时我忘记删除该行...兄弟。
    • 别担心它会发生,但继续回答,当你是对的时候,我会投票给你
    猜你喜欢
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    • 2020-10-26
    • 2011-10-09
    • 2021-11-16
    相关资源
    最近更新 更多