هل هناك شيء خاطئ في SimpleateThormat وتشكيل المنطقة الزمنية
-
27-09-2019 - |
سؤال
أنا على مستوى ذكاءي في هذه المشكلة المزعجة. في الأساس لا يمكن إصلاح هذا لفترة طويلة.
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]
السؤال هو ... لماذا؟
المحلول
ليس لدي أي فكرة عما لديك وما تريد أن ينتهي به الأمر ، لكنني أرى خطأً رئيسيًا واحدًا على الأقل في الكود. في هذا الخط
if((this.Time.substring(this.Time.length() - 2) == "am")||(this.Time.substring(this.Time.length() - 2) == "pm"))
أنت تقارن String
بالرجوع ، وليس بالقيمة. يجب أن تستخدم Object#equals()
كلما أردت مقارنة كائنين مختلفين. أ String
هل هو كائن ، وليس مثل بدائي int
, boolean
, ، إلخ ، التي ==
ستعمل كما هو مفيد ومتوقع.
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"))
بعد قولي هذا ، هناك بلا شك طريقة أكثر أناقة لكل ما تريد تحقيقه ، ولكن نظرًا لأن المتطلبات الوظيفية غير واضحة ، فمن المستحيل أن تقدم لك مثالًا على ذلك.
نصائح أخرى
إن مرور الكود الخاص بك ، يبدو أنه لا يتم تنفيذ أسطر التعليمات البرمجية التالية (التي تتوقعها للتنسيق).
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 String. أي أنك تستخدم "==" بدلاً من ".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"))