Java 获取设备';s本地时区

Java 获取设备';s本地时区,java,android,timezone,Java,Android,Timezone,2010-06-14 02:21:49+0400或2010-06-14 02:21:49-0400 是否有方法将此字符串转换为根据本地机器时区的日期,格式为2010-06-14 02:21 AM 注意:我不确定同一个类在andriod中是否可用。您可以使用DateFormat类对日期进行各种奇特的格式化和本地化。API页面的开头有非常好的完整文档: 大多数常规情况都可以使用内置的SimpleDataFormat对象处理。详情如下: 上面示例的SimpleDataFormat输出模式字符串为:

2010-06-14 02:21:49+0400或2010-06-14 02:21:49-0400

是否有方法将此字符串转换为根据本地机器时区的日期,格式为2010-06-14 02:21 AM


注意:我不确定同一个类在andriod中是否可用。

您可以使用DateFormat类对日期进行各种奇特的格式化和本地化。API页面的开头有非常好的完整文档:

大多数常规情况都可以使用内置的SimpleDataFormat对象处理。详情如下:

上面示例的SimpleDataFormat输出模式字符串为:

yyyy-MM-dd hh:mm a

除了@org.life.java和@Erica所说的,下面是您应该做的

String dateStr = "2010-06-14 02:21:49-0400";
SimpleDateFormat sdf =  new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZ");
TimeZone tz = TimeZone.getDefault();
sdf.setTimeZone(tz);
Date date = sdf.parse(dateStr);

sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a");
String newDateStr = sdf.format(date);

System.out.println(newDateStr);
然后,
newDateStr
将成为新的日期格式字符串


更新@xydev,我给你的示例很有用,请参阅下面的完整源代码:

/**
 * 
 */
package testcases;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

/**
 * @author The Elite Gentleman
 *
 */
public class Test {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
            String dateStr = "2010-06-14 02:21:49-0400";
            SimpleDateFormat sdf =  new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZ");
            TimeZone tz = TimeZone.getDefault();
            sdf.setTimeZone(tz);
            Date date = sdf.parse(dateStr);

            sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a");
            String newDateStr = sdf.format(date);

            System.out.println(newDateStr);
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

输出:
2010-06-14 08:21:49 AM

请注意,如果您在模拟器上运行,您的时区总是GMT。我花了两个小时试图理解为什么我的应用程序没有给我正确的时间(计算机显示的时间),直到我意识到这是因为模拟器

要检查您是否在模拟器上运行,请使用

if (Build.PRODUCT.contains("sdk")){
  // your code here for example if curtime has the emulator time 
  // since midnight in milliseconds then
  curtime += 2 * 60 * 60 * 1000;   // to add 2 hours from GMT
}

回答得好。不过,您可能需要将当月的“mm”大写,否则您将得到分钟的时间。:)Android基于Java 1.5,因此该类是存在的。在您的模式中,
ss
Z
之间必须没有空格。@精英绅士当然它是时区的对象,它持有默认时区,可以通过
TimeZone tz=TimeZone.getDefault()检索可能重复我最近回答的问题。@Elite先生们,是的,这是xydev请求的输出字符串的格式;“2010-06-14 02:21上午”:我得到的是“日期日期”周一6月14日11:51:49 GMT+00:00 2010的值。。。。并且应用程序在到达步骤“String newDateStr=sdf.format(date);”时崩溃,谢谢。。我得到了它。。。此代码导致错误//字符串dateStr=“2010-06-14 02:21:49-0400”//SimpleDataFormat sdf=新的SimpleDataFormat(“yyyy-MM-dd-HH:MM:ssZ”)//时区tz=TimeZone.getDefault()//设置时区(tz)//日期=“2010-06-14 02:21:49-0400”////尝试{//dates=sdf.parse(date);//}catch(ParseException e){///TODO自动生成的catch块//e.printStackTrace();//}
if (Build.PRODUCT.contains("sdk")){
  // your code here for example if curtime has the emulator time 
  // since midnight in milliseconds then
  curtime += 2 * 60 * 60 * 1000;   // to add 2 hours from GMT
}