首页 文章

SimpleDateFormat年份和时区格式是否有问题

提问于
浏览
1

在这个令人讨厌的问题上,我能够完成我的智慧 . 基本上无法解决这个问题很长一段时间 .

java.util.Calendar calendar_now = java.util.Calendar.getInstance();
     java.util.Calendar calendar_entry = java.util.Calendar.getInstance();
     java.util.Date dt = new Date();
     java.text.SimpleDateFormat formatter;
  try{
     // if(this.Time.length() == 0) {this.Time = "00:00";}
     //this.Time = "00:00";
     // System.out.println("*" + this.Time + "*");
     if((this.Time.substring(this.Time.length() - 2) == "am")||(this.Time.substring(this.Time.length() - 2) == "pm"))
     {
      formatter = new SimpleDateFormat("yyyy E MMM d H:mmaa z",Locale.US);
       dt = (Date)formatter.parse(calendar_now.get(java.util.Calendar.YEAR) + " " + this.Date + " " + this.Time + " EST");
      //calendar_entry.setTimeZone(java.util.TimeZone.getTimeZone("America/New_York"));
     }
      calendar_entry.setTime(dt);
      if (calendar_entry.get(java.util.Calendar.MONTH) < calendar_now.get(java.util.Calendar.MONTH)){
       calendar_entry.set(java.util.Calendar.YEAR,calendar_now.get(java.util.Calendar.YEAR) + 1);
      }
    else{
       calendar_entry.set(java.util.Calendar.YEAR,calendar_now.get(java.util.Calendar.YEAR));
    }
//    calendar_entry.setTimeZone(java.util.TimeZone.getTimeZone("GMT"));
      System.out.println(calendar_now.get(java.util.Calendar.YEAR) + " " + this.Date + " " + this.Time + " EST");
      System.out.println(dt.toString());
      System.out.println(calendar_entry);

这会产生:

2010 Fri Oct 1 10:00am EST
Thu Oct 01 10:00:00 SGT 1970
java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=true,lenient=true,zone=sun.uti
l.calendar.ZoneInfo[id="GMT",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],fi
rstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2010,MONTH=9,WEEK_OF_YEAR=40,WEEK_OF_MONTH=1,DAY_
OF_MONTH=1,DAY_OF_YEAR=274,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=2,HOUR_OF_DAY=2,MINUTE=
30,SECOND=0,MILLISECOND=0,ZONE_OFFSET=0,DST_OFFSET=0]

问题是......为什么?

2 回答

  • 1

    我不知道你拥有什么以及你想要最终得到什么,但我发现代码中至少有一个重大错误 . 在这一行

    if((this.Time.substring(this.Time.length() - 2) == "am")||(this.Time.substring(this.Time.length() - 2) == "pm"))
    

    您是按引用比较 String ,而不是按值 . 每当要比较两个不同的对象时,您应该使用Object#equals() . String 是一个对象,而不是像 intboolean 等原始对象, == 将按预期和预期的方式工作 .

    if((this.Time.substring(this.Time.length() - 2).equals("am"))||(this.Time.substring(this.Time.length() - 2).equals("pm")))
    

    但是,我建议改用String#endsWith()方法 . 这不仅更简洁,而且使代码更自我解释:

    if (this.Time.endsWith("am") || this.Time.endsWith("pm"))
    

    话虽如此,对于你想要达到的目标来说,毫无疑问是一种更优雅的方式,但由于功能要求不明确,所以不可能给你一个开始的例子 .

  • 1

    通过你的代码看起来像下面的代码行(你希望格式化)永远不会执行 .

    formatter = new SimpleDateFormat("yyyy E MMM d H:mmaa z",Locale.US);
     dt = (Date)formatter.parse(calendar_now.get(java.util.Calendar.YEAR) + " " + this.Date + " " + this.Time + " EST");
    

    正如BalusC正确指出的那样,这是由于String comaprison的条件语句无效 . 即您使用“==”而不是“.equals”方法 . 您可以通过使用以下方法修正BalusC建议的问题来解决您的问题:

    if (this.Time.endsWith("am") || this.Time.endsWith("pm"))
    

    代替:

    if((this.Time.substring(this.Time.length() - 2) == "am")||(this.Time.substring(this.Time.length() - 2) == "pm"))
    

相关问题