关于java:SimpleDateFormat年份和时区格式是否有问题

Is there something wrong with SimpleDateFormat year and timezone formating

在这个烦人的问题上,我已无计可施了。基本上很长一段时间都无法解决这个问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
     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);

这将产生:

1
2
3
4
5
6
7
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]

问题是…为什么?


在代码中,似乎从未执行过以下代码行(您希望格式化这些代码)。

1
2
 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正确指出的,这是由于字符串comaprison的条件语句无效。也就是说,您使用的是"=",而不是".equals"方法。您的问题将通过使用以下方法纠正与Balusc建议的相同之处来解决:

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

而不是:

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


我不知道你有什么,你想以什么结束,但我看到代码中至少有一个重大错误。在这条线上

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

你是参照比较String,而不是价值。当您想比较两个不同的对象时,应该使用Object#equals()String就是一个对象,而不是像intboolean等原始的对象,==将按预期和意图工作。

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

不过,我建议使用String#endsWith()方法。这不仅更加简洁,而且使代码更加自我解释:

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

尽管如此,毫无疑问,对于您想要实现的任何目标,都有一种更优雅的方式,但是由于功能需求不明确,所以不可能给出一个这样的启动示例。