【问题标题】:How to convert date object to ones own timezone in android?如何在android中将日期对象转换为自己的时区?
【发布时间】:2015-03-04 19:35:13
【问题描述】:

在 android 中,我从免费网络服务器上的 MySQL 数据库下载日期信息,然后使用以下方法将其转换为 Date 对象:

注意:服务器时间比多伦多提前 5 小时。

public static Date getDateFromSQLDate(String sqldate) {
    try {
        DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
        Date date = (Date) formatter.parse(sqldate);

        TimeZone targetTimeZone = TimeZone.getDefault();
        TimeZone serverTimeZone = TimeZone.getTimeZone("Europe/London");
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.setTimeZone(serverTimeZone);


        calendar.add(Calendar.MILLISECOND, serverTimeZone.getRawOffset() * -1);
        if (serverTimeZone.inDaylightTime(calendar.getTime())) {
            calendar.add(Calendar.MILLISECOND, calendar.getTimeZone().getDSTSavings() * -1);
        }

        calendar.add(Calendar.MILLISECOND, targetTimeZone.getRawOffset());
        if (targetTimeZone.inDaylightTime(calendar.getTime())) {
            calendar.add(Calendar.MILLISECOND, targetTimeZone.getDSTSavings());
        }

        return calendar.getTime();
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return null;
}

这似乎不起作用..

问题在于日期与服务器的时区有关。一次下载可能会与时间混淆,因为他们不知道它不在自己的时区。

我有一个 Date 对象,有没有办法可以检索用户手机所在位置的时区,然后将该 Date 对象修改为他们自己的时区?

谢谢

编辑:

How to get TimeZone from android mobile?

这得到了一个时区对象,但是我如何用它来改变一个 Date 对象呢?

【问题讨论】:

    标签: java android date datetime timezone


    【解决方案1】:

    我的应用必须像您一样处理服务器时间。 (我从服务器获得的所有日期时间都代表 UTC +00:00 的日期时间)

    // date string to convert
    String dateString = "2014-01-07 12:00:00"
    
    // create date formatter, set time zone to UTC and parse 
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);
    TimeZone serverTimeZone = TimeZone.getTimeZone("UTC");
    formatter.setTimeZone(serverTimeZone);
    Date date = formatter.parse(dateString);
    
    Log.i("Debug", "date object : " + date.toString());
    // I'm in Bangkok (UTC +07:00) so I'll see "Wed Jan 07 19:00:00 GMT+07:00 2015"
    // If you do this in Toronto, you should see "Wed Jan 07 07:00:00 GMT -05:00 2015"
    

    当您想在多伦多打印此日期时,我相信您不必自己计算 DST,因为日历和日期格式化程序应该可以处理(不确定,我很久以前从某个地方读过)

    // Create timezone for Toronto
    TimeZone torontoTimeZone = TimeZone.getTimeZone("America/Toronto");
    
    // Create calendar, set timezone, to see hour of day in Toronto
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeZone(torontoTimeZone);
    calendar.setTime(date);
    
    Log.i("Debug", "Hour of day : " + calendar.get(Calendar.HOUR_OF_DAY);
    // Hour of day : 7
    
    // Create date formatter, set timezone, to print date for Toronto user.
    SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy, hh:mm", Locale.US);
    formatter.setTimeZone(torontoTimeZone);
    String torontoDate = formatter.format(date);
    
    Log.i("Debug", "Date in Toronto : " + torontoDate);
    // Date in Toronto : 07 Jan 2015, 07:00
    

    您可以通过替换将日历和日期格式化程序设置为用户时区

    TimeZone timezone = TimeZone.getTimeZone("America/Toronto")
    

    TimeZone timezone = TimeZone.getDefault()
    

    当我处理来自服务器的日期时,我会

    • 向服务器请求UTC时间,如果服务器没有给我发送UTC时间,请先转换为UTC时间。
    • 从服务器解析日期对象时,我总是创建代表 UTC 时间(服务器时间)的日期对象
    • 使用 UTC 日期对象执行计算或其他任何操作。
    • 仅在 Activity/Fragment/Service/Model 之间传递 UTC 日期对象
    • 仅当我需要向用户显示时才使用用户时区格式化日期字符串。

    【讨论】:

      【解决方案2】:

      这是您可以将日期更改为您的时区的方法

      SimpleDateformat sdf = new SimpleDateFormat("yourformat");   
      TimeZone tz = TimeZone.getDefault(); 
      sdf.setTimezone(tz);
      sdf.format(yourdate); //will return a string in "your-format" to represent date
      

      【讨论】:

        【解决方案3】:

        你在正确的轨道上。您需要将日历对象的时区设置为服务器的时区。然后,您可以使用从用户设备(包含的链接)获得的 TimeZone 添加偏移量(和 DST 中的因子)。

        代码:

        calendar.add(Calendar.MILLISECOND, serverTimeZone.getRawOffset() * -1);
                if (serverTimeZone.inDaylightTime(calendar.getTime())) {
                    calendar.add(Calendar.MILLISECOND, calendar.getTimeZone().getDSTSavings() * -1);
                }
        
                calendar.add(Calendar.MILLISECOND, targetTimeZone.getRawOffset());
                if (targetTimeZone.inDaylightTime(calendar.getTime())) {
                    calendar.add(Calendar.MILLISECOND, targetTimeZone.getDSTSavings());
                }
        

        之后,您可以按常规方式从日历中检索日期。 另请参阅this answer 了解更多信息。

        【讨论】:

        • 你能显示完整的代码吗,我不确定我应该从我的代码中保留什么。
        • 我不确定它是否真的有效,因为当我拥有 calendar.setTimeZone(targetTimeZone); 以及将其更改为 calendar.setTimeZone(serverTimeZone); 时,它给出了正确的时间。
        猜你喜欢
        • 2012-12-01
        • 2016-12-08
        • 2014-07-16
        • 2015-08-18
        • 2016-05-24
        • 2015-12-10
        • 2017-01-08
        • 1970-01-01
        • 2022-08-18
        相关资源
        最近更新 更多