Java SimpleDateFormat年份和时区格式是否有问题
我对这个烦人的问题束手无策。很长一段时间内基本上无法解决这个问题Java SimpleDateFormat年份和时区格式是否有问题,java,simpledateformat,Java,Simpledateformat,我对这个烦人的问题束手无策。很长一段时间内基本上无法解决这个问题 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
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);
java.util.Calendar\u now=java.util.Calendar.getInstance();
java.util.Calendar\u entry=java.util.Calendar.getInstance();
java.util.Date dt=新日期();
java.text.SimpleDataFormat格式化程序;
试一试{
//如果(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”))
{
格式化程序=新的SimpleDataFormat(“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(“美国/纽约”));
}
日历条目的设置时间(dt);
if(calendar\u entry.get(java.util.calendar.MONTH)
这将产生:
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]
2010年10月1日星期五美国东部时间上午10:00
1970年10月1日星期四10:00:00中士
java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=true,lenient=true,zone=sun.uti
l、 calendar.ZoneInfo[id=“GMT”,偏移量=0,DSTSAVIES=0,useDaylight=false,转换=0,lastRule=null],fi
rstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2010,MONTH=9,YEAR=40,WEEK=1,DAY=1,YEAR=2010_
月的天数=1,年的天数=274,周的天数=5,周的天数=1,上午下午=0,小时=2,日的小时=2,分钟=
30,秒=0,毫秒=0,分区_偏移=0,DST_偏移=0]
问题是……为什么?我不知道您有什么,也不知道您希望得到什么,但我看到代码中至少有一个重大错误。在这一行中
if((this.Time.substring(this.Time.length() - 2) == "am")||(this.Time.substring(this.Time.length() - 2) == "pm"))
您是通过引用而不是通过值来比较String
。字符串
就是一个对象,而不是像int
,boolean
等那样的原语,=
将按照预期和预期工作
if((this.Time.substring(this.Time.length() - 2).equals("am"))||(this.Time.substring(this.Time.length() - 2).equals("pm")))
但是,我建议改为使用该方法。这不仅更加简洁,而且使代码更加自我解释:
if (this.Time.endsWith("am") || this.Time.endsWith("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");
正如BalusC正确指出的,这是由于字符串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"))
问题是-出了什么问题?我敢打赌,如果你指出了什么问题以及原因,你会得到更好的回答。不要让人们通读那些混乱的东西来找出困扰你的原因。好吧,现在代码看起来确实更漂亮了。也许我应该问一个更具体的问题。为什么日期对象中没有修改年份和时区不只是像原来的字符串???应该是2010年EST,而不是1970年SGT?这就是我的回答。你在“dt”对象中设置日期、时间和时区,条件块从不执行。不要使用“=”进行字符串比较,条件总是假的,因为“=”在您的情况下使用。请尝试我的答案中建议的条件,它应该会像您期望的那样工作。非常感谢它现在可以工作。我们将尝试并找出为什么只有时间/日期可以工作。好的,现在代码看起来确实更漂亮。也许我应该问一个更具体的问题。为什么日期对象中没有修改年份和时区就像原来的字符串一样???应该是2010年EST,而不是1970年SGT?因为从来没有输入过
if
块。非常感谢,现在它可以工作了。我们来看看为什么只有时间/日期可以工作。你只能在拥有至少15个声誉的情况下投票。不过,你可以标记cl接受的最有用的答案勾选复选标记。