Java 如何更正EST格式的日期?

Java 如何更正EST格式的日期?,java,date,Java,Date,在我的基于struts的web应用程序中,我获得了有关调度器下一次运行的数据。然后我将其传递给一个将设置发票日期的方法。具体情况是,我们需要管理整个月的交易。当月完成后,将在下个月的第一天生成相应的发票。例如,如果所有交易发生在2020年1月,则发票日期应为2020年2月1日 但现有的方法似乎有缺陷。它向最终用户显示日期 我们将于2022年7月1日美国东部时间上午12:00开具发票 应该是 我们将于2020年2月1日美国东部时间上午12:00开具发票 片段: List<ScheduleTa

在我的基于struts的web应用程序中,我获得了有关调度器下一次运行的数据。然后我将其传递给一个将设置发票日期的方法。具体情况是,我们需要管理整个月的交易。当月完成后,将在下个月的第一天生成相应的发票。例如,如果所有交易发生在2020年1月,则发票日期应为2020年2月1日

但现有的方法似乎有缺陷。它向最终用户显示日期

我们将于2022年7月1日美国东部时间上午12:00开具发票

应该是

我们将于2020年2月1日美国东部时间上午12:00开具发票

片段:

List<ScheduleTaskInfo> sInfo = sManagement
                        .getSchedulerTaskList(SchedulerTask.BillingViewTask,
                                cProduct.getAccountId(), cProduct.getId(),
                                cProduct.getRunningId());

if (sInfo != null && sInfo.size() > 0) {
                    ScheduleTaskInfo info = sInfo.get(0);
                    try {
                        setInvoiceDate(dateUtil.getFormattedTime(
                                info.getNextRun(), "MM-dd-yyyy H:mm"));
                    } catch (Exception e) {
                        logger.error(e.getMessage(), e);
                    }

                }
getStringToUtilDate

public  java.util.Date getStringToUtilDate(String dateString,
            String format) throws ParseException {
        SimpleDateFormat sd = null;
        try {
            format = getDateFormat(format);
             sd = new SimpleDateFormat(format);
            sd.setTimeZone(TimeZone.getTimeZone("EST"));
        } catch (Exception e) {
            e.printStackTrace();
        }       
        return sd.parse(dateString);
    }
负责生成EST格式的代码如下

下面的代码段返回的日期为美国东部时间2022年7月1日凌晨12:00


如何纠正这种情况?

希望使用Java 8 LocalDateTime api而不是旧的Java util日期。它更干净

LocalDateTime nextRunDate = LocalDateTime.parse("2022-01-01 00:00", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));

/*Custom Date Manipulation Logic*/
LocalDateTime expectedInvoiceDate=nextRunDate.plusMonths(1);

String invoiceDate = DateTimeFormatter.ofPattern("dd MMMM yyyy hh:mm a z")
        .format(
                expectedInvoiceDate.atZone(ZoneId.of("America/New_York"))
        );

System.out.println(invoiceDate);
根据需要选择时区


使用
new Date()
输出为
2020年1月8日美国东部时间凌晨2:36
信息对象通过从数据库中获取数据填充似乎有许多步骤我们没有代码,例如
format=getDateFormat(format)
(看起来也很奇怪)和
getStringToUtilDate
不要使用EST,使用(例如)美国/纽约。你的代码乱七八糟。首先从
format=getDateFormat(format)开始;结果=GetTestTime(getStringToUtilDate(日期字符串,格式))
然后执行
getStringToUtilDate
操作,执行
getDateFormat
和解析,然后执行
getESTTime
操作,忽略格式,但执行几乎完全相同的操作
public  String getESTTime(java.util.Date date) {
    String strDate = null;
    try {
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd  MMMM yyyy h:mm aa zzz");
        dateFormat.setTimeZone(TimeZone.getTimeZone("EST"));
        strDate = dateFormat.format(date);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return  strDate;
}
LocalDateTime nextRunDate = LocalDateTime.parse("2022-01-01 00:00", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));

/*Custom Date Manipulation Logic*/
LocalDateTime expectedInvoiceDate=nextRunDate.plusMonths(1);

String invoiceDate = DateTimeFormatter.ofPattern("dd MMMM yyyy hh:mm a z")
        .format(
                expectedInvoiceDate.atZone(ZoneId.of("America/New_York"))
        );

System.out.println(invoiceDate);