Java,将日期转换为字符串并返回错误的日期

Java,将日期转换为字符串并返回错误的日期,java,date-format,simpledateformat,Java,Date Format,Simpledateformat,我正在尝试将日期转换为字符串,然后再次转换为日期。但是我发现最后的日期和原来的日期不一样,有什么区别 //1975-06-20 Calendar cal = Calendar.getInstance(); cal.set(Calendar.YEAR, 1975); cal.set(Calendar.MONTH, 5); cal.set(Calendar.DAY_OF_MONTH, 20); cal.set(Calendar.HOUR, 0);

我正在尝试将
日期
转换为
字符串
,然后再次转换为
日期
。但是我发现最后的日期和原来的日期不一样,有什么区别

    //1975-06-20
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.YEAR, 1975);
    cal.set(Calendar.MONTH, 5);
    cal.set(Calendar.DAY_OF_MONTH, 20);
    cal.set(Calendar.HOUR, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    System.out.println(cal);

    Date originalDate = cal.getTime();
    System.out.println("Date 1: " + originalDate.toString());

    SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
    Date date = sdf.parse(originalDate.toString());
    System.out.println("Date 2: " + date.toString());
上述代码的输出为:

cal: java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Singapore",offset=28800000,dstSavings=0,useDaylight=false,transitions=9,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=1975,MONTH=5,WEEK_OF_YEAR=26,WEEK_OF_MONTH=5,DAY_OF_MONTH=20,DAY_OF_YEAR=179,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=4,AM_PM=1,HOUR=0,HOUR_OF_DAY=16,MINUTE=0,SECOND=0,MILLISECOND=333,ZONE_OFFSET=28800000,DST_OFFSET=0]
Date 1: Fri Jun 20 12:00:00 SGT 1975
Date 2: Fri Jun 20 11:30:00 SGT 1975

可能是因为1982年新加坡的时区变化(+30分钟)


SimpleDataFormat在解析日期时将SGT作为UTC+8,并将其转换为UTC+7.5,即1982年之前的SGT。因此,日期被取消了30分钟。

您确定粘贴的代码正确吗

Date-Date=DateFormat.format(originalDate.toString(),“EEE-MMM-dd-HH:mm:ss-zzz-yyyy”)


似乎有问题:没有使用签名日期日期格式的方法。据我所知,格式(字符串,字符串)可以识别区域设置,而as Date则不能识别。请参阅没有DateFormat.format(String,String)方法。您的代码无法编译。格式化日期的toString()表示形式有什么意义?为什么要解析originalDate的toString(),而不是解析格式化的日期?@Brad,您对
DateFormat.format()
的调用与Java API不匹配:@JB niset和@Hugo,您是对的。第一个方法是由我的团队创建的实用程序类。它也使用
SimpleDateFormat
。我已将其从问题中删除,以避免混淆。但是我的问题仍然有效,我已经删除了那个部分。它是由我的团队创建的实用程序类。很抱歉。但我的问题仍然有效。这解释了30分钟的差异,但没有解释为什么原始时间中的“小时”在设置为
cal.set(Calendar.HOUR,0)
时显示为
12
@Rosdi,这是你问题中的一个输入错误吗?@Brad:因为
HOUR
是上午/下午的一小时(12小时周期),而在新加坡现在是下午(这会影响
.getInstance()
),所以当代码将
小时设置为0时,它被设置为下午12点<代码>一天中的小时数
将设置一天中24小时的小时数。