首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PST时间转换

PST时间转换
EN

Stack Overflow用户
提问于 2016-09-14 18:06:33
回答 1查看 393关注 0票数 0

我正在计算每月的最后一个工作日,合并如下-

·AI.VOUCHER_DT >=太平洋标准时间本月最后一个工作日下午5:00

·太平洋标准时间下午11:59:59 :59 AI.VOUCHER_DT <= (太平洋标准时间)

·当前系统日期/时间<下个月的第三个工作日

例如,2月28日(星期六)是一个月的最后一个日历日,计时权责发生文件应包括在2月27日(星期五)下午5:00到2月28日(星期六)下午23:59:59之间创建的凭证。记录将保留在应计项目上,直到3月4日,在本例中是该月的第3个工作日。

我怎么能比较这个。

EN

回答 1

Stack Overflow用户

发布于 2016-09-14 21:20:14

我创建了一个会计日期类,它生成您要求的3个会计日期。

我运行了两个测试,一个针对2015年2月,另一个针对2016年8月。以下是测试结果。

代码语言:javascript
复制
Fri, 27 Feb 2015 17:00:00 PST
Sat, 28 Feb 2015 23:59:59 PST
Wed, 04 Mar 2015 00:00:00 PST

Wed, 31 Aug 2016 17:00:00 PDT
Wed, 31 Aug 2016 23:59:59 PDT
Mon, 05 Sep 2016 00:00:00 PDT

第一个日期是该月的最后一个工作日,第二个日期是该月的最后一天,第三个日期是下一个月的第三个工作日。

这是代码。我使用Calendar类进行日期计算。输入月份是从零开始的。0=一月,1=二月,依此类推。

代码语言:javascript
复制
package com.ggl.testing;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class FiscalDate {

    public static void main(String[] args) {
        SimpleDateFormat sdf = new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss z");
        sdf.setTimeZone(getTimeZone());

        displayDates(sdf, 2015, 1);
        displayDates(sdf, 2016, 7);
    }

    private static void displayDates(SimpleDateFormat sdf, int year, int month) {
        Date date = calculateLastBusinessDay(year, month);
        System.out.println(sdf.format(date));
        date = calculateLastDay(year, month);
        System.out.println(sdf.format(date));
        date = calculateThirdBusinessDay(year, month);
        System.out.println(sdf.format(date));
        System.out.println();
    }

    public static Date calculateLastBusinessDay(int year, int month) {
        Calendar calendar = calculateLastCalendarDay(year, month);

        while (!isWeekday(calendar)) {
            calendar.add(Calendar.DAY_OF_MONTH, -1);
        }

        calendar.set(Calendar.HOUR_OF_DAY, 17);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);

        return calendar.getTime();
    }

    public static Date calculateLastDay(int year, int month) {
        Calendar calendar = calculateLastCalendarDay(year, month);
        calendar.set(Calendar.HOUR_OF_DAY, 23);
        calendar.set(Calendar.MINUTE, 59);
        calendar.set(Calendar.SECOND, 59);
        calendar.set(Calendar.MILLISECOND, 999);

        return calendar.getTime();
    }

    public static Date calculateThirdBusinessDay(int year, int month) {
        Calendar calendar = calculateLastCalendarDay(year, month);
        int weekdayCount = 0;

        while (weekdayCount < 3) {
            calendar.add(Calendar.DAY_OF_MONTH, 1);
            weekdayCount += isWeekday(calendar) ? 1 : 0;
        }

        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);

        return calendar.getTime();
    }

    private static Calendar calculateLastCalendarDay(int year, int month) {
        Calendar calendar = Calendar.getInstance(getTimeZone());
        calendar.set(Calendar.YEAR, year);
        calendar.set(Calendar.MONTH, month);
        calendar.set(Calendar.DAY_OF_MONTH,
                calendar.getActualMaximum(Calendar.DAY_OF_MONTH));

        return calendar;
    }

    private static boolean isWeekday(Calendar calendar) {
        int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
        return (dayOfWeek == Calendar.MONDAY)
                || (dayOfWeek == Calendar.TUESDAY)
                || (dayOfWeek == Calendar.WEDNESDAY)
                || (dayOfWeek == Calendar.THURSDAY)
                || (dayOfWeek == Calendar.FRIDAY);
    }

    private static TimeZone getTimeZone() {
        return TimeZone.getTimeZone("America/Los_Angeles");
    }

}

如果您所在的位置与美国不同,则应使用不同的时区。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39487761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档