Java SimpleDataFormatter返回两个不同的时区
我有这两个字符串作为输入字符串Java SimpleDataFormatter返回两个不同的时区,java,datetime,time,simpledateformat,dst,Java,Datetime,Time,Simpledateformat,Dst,我有这两个字符串作为输入字符串 03/12/16 03/14/16 我创建了一个单一SimpleDataFormatter对象来获得这样的日期差 DateFormat formatter = new SimpleDateFormat("MM/dd/yy",Locale.US); Date dateChkIn = formatter.parse("03/12/16"); System.out.println("Checkin date at nights check - "+dateChkIn.
03/12/16
03/14/16
我创建了一个单一SimpleDataFormatter对象来获得这样的日期差
DateFormat formatter = new SimpleDateFormat("MM/dd/yy",Locale.US);
Date dateChkIn = formatter.parse("03/12/16");
System.out.println("Checkin date at nights check - "+dateChkIn.toString());
Date dateChkOut = formatter.parse("03/14/16");
System.out.println("Checkout date at nights check - "+dateChkOut.toString());
Long numberOfNghtsCalc = ((dateChkOut.getTime() - dateChkIn.getTime()) / 86400000L);
System.out.println("number of nigts calculated - "+ numberOfNghtsCalc);
下面是我在服务器中的输出
Checkin date at nights check - Sat Mar 12 00:00:00 EST 2016
Checkout date at nights check - Mon Mar 14 00:00:00 EDT 2016
number of nigts calculated - 1
预期输出为计算的NIGT数-2
请注意格式化程序返回的两个不同时区
更新:
2016年3月13日被视为DST变更日期。因此,我的计算是错误的。(除以86400000L)在接下来的2016年3月13日,按美国东部标准时间改为美国东部标准时间。因此,
SimpleDateFormat
会处理此更改
Go这一差异是由夏令时造成的,2016年夏令时计划为2016年3月13日。在这里,你可以阅读一篇关于两者区别的短文。我找到了解决方案。我知道最好的解决方案是使用Joda时间。但在现有代码中改动最少的情况下,我认为这种巧妙的方法会更好。如果您发现任何缺点,请编辑此答案
List<Date> dates = new ArrayList<Date>();
Calendar calendar = new GregorianCalendar();
calendar.setTime(dateChkIn);
Date result = null;
while (calendar.getTime().before(dateChkOut)){
result = calendar.getTime();
dates.add(result);
calendar.add(Calendar.DATE, 1);
}
System.out.println("DAYS CALCULATED BY NEW SOLUTION: " + dates.size());
newNumberOfNghtsCalc = (long) dates.size();
dates.clear();
List dates=new ArrayList();
日历=新的公历日历();
日历设置时间(dateChkIn);
日期结果=空;
while(calendar.getTime().before(dateChkOut)){
结果=calendar.getTime();
日期。添加(结果);
calendar.add(calendar.DATE,1);
}
System.out.println(“由新解决方案计算的天数:+dates.size());
newNumberOfNghtsCalc=(长)日期。大小();
日期。清除();
这实际上减少了运行时间
问题代码所用时间:275000(纳秒)
新解决方案所用时间:103000java.Time
我建议您使用现代的,java.time
date-time API
演示:
import java.time.Duration;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("M/d/uu", Locale.ENGLISH);
LocalDate dateChkIn = LocalDate.parse("03/12/16", dtf);
LocalDate dateChkOut = LocalDate.parse("03/14/16", dtf);
long days = ChronoUnit.DAYS.between(dateChkIn, dateChkOut);
System.out.println(days);
}
}
2
输出:
import java.time.Duration;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("M/d/uu", Locale.ENGLISH);
LocalDate dateChkIn = LocalDate.parse("03/12/16", dtf);
LocalDate dateChkOut = LocalDate.parse("03/14/16", dtf);
long days = ChronoUnit.DAYS.between(dateChkIn, dateChkOut);
System.out.println(days);
}
}
2
从了解现代日期时间API
- 无论出于何种原因,如果您必须坚持使用Java6或Java7,您可以使用哪个backport将大部分Java.time功能移植到Java6&7
- 如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查并确认
Calendar
尝试添加formatter.setTimeZone(TimeZone.getTimeZone(“GMT”)代码>下面的SimpleDateFormat
您可以阅读此内容,我很抱歉。我对夏令时不太了解。这个问题在我们的产品中被报道过。我需要做任何代码级别的更改来处理这个问题吗?这是非常罕见的情况吗?我该如何告知我的美国客户?@JudeNiroshan:不罕见!每年,当更改EST->EDT和viceversa时,您都会遇到相同的问题。如果您使用不同的时区(即欧洲和美国),您会遇到相同的问题。但我的问题是,为什么SimpleDateFomatter返回两个不同的时区?美国东部时间12日和美国东部时间16日?@Jude:SimpleDateFormatter返回相同的时区,但该区域的时区会发生变化。因此,自卫队对这一变化是明智的。