【问题标题】:timezone conversion and date is not displaying properly时区转换和日期显示不正确
【发布时间】:2012-08-21 06:08:07
【问题描述】:
Calendar cal= Calendar.getInstance();
System.out.println(cal.getTimeZone().getID());
cal.set(2012, 8, 21);
java.util.Date d = new java.util.Date();
System.out.println(d.toString());

//System.setProperty("user.timezone", "America/Chicago");

//  System.out.println(TimeZone.getDefault().getID());

TimeZone tz1 = TimeZone.getTimeZone("Africa/Algiers");
//tz1.setDefault(tz1);

cal.setTimeZone(tz1);
System.out.println(cal.getTimeZone().getID());

//cal.set(2012, 8, 21);
System.out.println(d.toString());

输出是--

Asia/Calcutta
Tue Aug 21 11:35:06 IST 2012
Africa/Algiers
Tue Aug 21 11:35:06 IST 2012

我想要当前时区格式的时间,但它在 IST 中给出。如何做到这一点。

【问题讨论】:

    标签: java calendar timezone


    【解决方案1】:

    编辑:我刚刚注意到您给出的代码甚至没有调用cal.getTime()。您完全忽略了日历中的值。无论如何它不会做你想要的,但你打印的值只是new Date()...你希望日历如何参与?

    我想要当前时区格式的时间,但它在 IST 中给出。如何做到这一点。

    一开始就避免使用Date.toStringDate 值没有时区的概念,因此 toString 始终只使用系统时区。更改日历的时区而不再次调用 set 也不会更改基础值。

    现在有两种选择:

    • 使用SimpleDateFormat,在格式化前指定时区
    • 改用Joda Time,这是一个更丰富的日期和时间API

    我个人强烈建议您使用后一个选项,尤其是在您进行大量日期/时间操作时。 DateCalendarSimpleDateFormat 只是不要让您编写清楚地表达您在任何时间点拥有的数据的代码。

    【讨论】:

    • 嘿,我在项目中使用 Joda 时间。但我仍然面临转换的问题。那么怎么显示呢??
    • @Kumar:“如何显示”是一个非常广泛的问题。如果您在其他地方使用 Joda Time,您应该开始一个新问题,告诉我们您想要做什么,而不使用 DateCalendar
    • @johnskeet-- 我在这里和下面使用 jodatime api 是代码 Calendar cal= Calendar.getInstance(); System.out.println(cal.getTimeZone().getID()); //cal.set(2012, 8, 21,06,05,01);日期时间 d = DateTime.now(); System.out.println(d.toString()); //System.setProperty("user.timezone", "America/Chicago"); // System.out.println(TimeZone.getDefault().getID()); TimeZone tz1 = TimeZone.getTimeZone("America/New_York");//非洲/阿尔及尔 //日历调用 = GregorianCalendar.getInstance(tz1, Locale.) tz1.setDefault(tz1);
    • 继续 - cal.setTimeZone(tz1); System.out.println(cal.getTimeZone().getID()); //cal.set(2012, 8, 21); System.out.println(d.toString()); O/p 是 -Asia/Calcutta 2012-08-21T12:01:25.564+05:30 America/New_York 2012-08-21T12:01:25.564+05:30
    • 这显示出了一些问题。我正在使用 evry where dateTime of joda time API。所以这显示错误。请检查 o/p。
    【解决方案2】:

    使用TimeZone.setDefault(tz1); 而不是//tz1.setDefault(tz1);

    Calendar cal = Calendar.getInstance();
        System.out.println(cal.getTimeZone().getID());
        cal.set(2012, 8, 21);
        java.util.Date d = new java.util.Date();
        System.out.println(d.toString());       
    
        TimeZone tz1 = TimeZone.getTimeZone("Africa/Algiers");
        TimeZone.setDefault(tz1);
    
        cal.setTimeZone(tz1);
        System.out.println(cal.getTimeZone().getID());
    
        System.out.println(d.toString());
    

    我运行你的程序,查看输出:

    Asia/Calcutta
    Tue Aug 21 11:47:13 IST 2012
    Africa/Algiers
    Tue Aug 21 07:17:13 CET 2012
    

    【讨论】:

    • 你注意到区别了吗?
    • @JonSkeet 告诉你标准方法,使用它。我只提供了一个解决方案,即让您的程序运行。
    • 请看我对“johnskeet”的评论。我基本上使用的是 JOdaTime API,但是当我使用它时; o/p 根据您的程序使用不正确。
    【解决方案3】:

    日历不能那样工作...我有 SimpleDateFormat 代码..它可能会有所帮助..试试这个

    public class TimeZoneTest {  
    
        public static void main(String[] args) {  
            new TimeZoneTest().setTimeZones();  
        }  
    
        private void setTimeZones(){  
    
            String etStart = "";  
            String ctStart = "";  
            String mtStart = "";  
            String ptStart = "";  
    
            DateFormat fullDateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");  
    
                        String dateString = "Mon Mar 14 09:30:51 GMT 2011";  
    
                                    //this input date doesn't convert  
                                    //String dateString = "Mon Mar 14 09:30:51 PDT 2011";  
    
            System.out.println("Input Date: " + dateString);  
            System.out.println("Default TimeZone: " + TimeZone.getDefault());         
    
            try {  
                etStart = getDateInTimeZone(dateString, fullDateFormat, TimeZone.getTimeZone("America/New_York"));  
                ctStart = getDateInTimeZone(dateString, fullDateFormat, TimeZone.getTimeZone("America/Chicago"));  
                mtStart = getDateInTimeZone(dateString, fullDateFormat, TimeZone.getTimeZone("America/Denver"));  
                ptStart = getDateInTimeZone(dateString, fullDateFormat, TimeZone.getTimeZone("America/Los_Angeles"));  
            } catch (ParseException e) {  
                e.printStackTrace();  
                                     }  
    
            System.out.println("Eastern Date: " + etStart);  
            System.out.println("Central Date: " + ctStart);  
            System.out.println("Mountain Date: " + mtStart);  
            System.out.println("Pacific Date: " + ptStart);       
    
        }  
    
         private String getDateInTimeZone(Date inputDt, TimeZone targetTimeZone) throws ParseException{  
    
            DateFormat fullDateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");  
            fullDateFormat.setTimeZone(targetTimeZone);  
            return fullDateFormat.format(inputDt);  
    
        }  
    
    }  
    

    【讨论】:

      猜你喜欢
      • 2019-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-27
      • 2019-08-18
      • 1970-01-01
      相关资源
      最近更新 更多