风-fmgao

导航

简单算法3

股票

package com.sly.uploadfile.algorithm;

/**
 * Created by fmgao on 2019/7/9.
 * 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
 * <p>
 * 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。
 * <p>
 * 注意你不能在买入股票前卖出股票。
 * <p>
 * 示例 1:
 * <p>
 * 输入: [7,1,5,3,6,4]
 * 输出: 5
 * 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
 * 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。
 */
public class Gupiao01 {

    public static int maxProfit(int[] prices) {
        if (prices == null || prices.length == 0) {
            return 0;
        }
        int[] dp = new int[prices.length];
        int minPrice = prices[0];
        for (int i = 1; i < prices.length; i++) {
            minPrice = Math.min(minPrice, prices[i]);
            dp[i] = Math.max(dp[i - 1], prices[i] - minPrice);//只需记住当前的最小值即可
        }
        return dp[prices.length - 1];
    }

    public static void main(String[] args) {
        int[] a = {7, 1, 5, 3, 6, 4};
        int d = maxProfit(a);
        System.out.println(d);

        System.out.println(getMax(a));
    }

    public static int getMax(int[] a) {
        if (a.length == 0 || a == null) {
            return 0;
        }
        int b[] = new int[a.length];
        int mina = a[0];
        for (int i = 1; i < a.length; i++) {
            mina = Math.min(mina, a[i]);
            b[i] = Math.max(b[i - 1], a[i] - mina);
        }
        return b[a.length - 1];
    }
}

括号分数

package com.sly.uploadfile.algorithm;

import java.util.Stack;

/**
 * Created by fmgao on 2019/9/11.
 * 给定一个平衡括号字符串 S,按下述规则计算该字符串的分数:
 * <p>
 * () 得 1 分。
 * AB 得 A + B 分,其中 A 和 B 是平衡括号字符串。
 * (A) 得 2 * A 分,其中 A 是平衡括号字符串。
 * <p>
 * <p>
 * 示例 1:
 * <p>
 * 输入: "()"
 * 输出: 1
 */
public class KuoHaoFenShu {
    public static void main(String[] args) {
        System.out.println(scoreOfParent("((()))"));
    }

    public static int scoreOfParent(String s) {
        Stack<String> stack = new Stack<>();
        for (int i = 0, len = s.length(); i < len; i++) {
            if ('(' == s.charAt(i)) {
                stack.push("(");
            } else {
                if ("(".equals(stack.peek())) {
                    stack.pop();
                    stack.push(1 + "");
                } else {
                    int intTemp = Integer.parseInt(stack.pop());
                    if ("(".equals(stack.peek())) {
                        stack.pop();
                        stack.push((intTemp * 2) + "");
                    }
                }
//                如果栈里面的元素有多个数字的情况,那么你就需要把这几个数字进行相加,然后再压入栈
                int add = 0;
                while (!stack.isEmpty() && !"(".equals(stack.peek())) {
                    add += Integer.parseInt(stack.pop());
                }
                stack.push(add + "");
            }
        }
        return Integer.parseInt(stack.pop());
    }
}

字符串长度

package com.sly.uploadfile.algorithm;

/**
 * Created by fmgao on 2020/1/7.
 */
public class LengthOfString {

    public static void main(String[] args) {
        String a = "i am a person";
        System.out.println(getLength(a));
        System.out.println(getLength1(a));
    }

    private static int getLength(String s) {
        if (s == "") {
            return 0;
        }
        if (s.trim().length() == 0) {
            return 0;
        }
        String[] a = s.split(" ");
        return a[a.length - 1].length();
    }

    private static int getLength1(String s) {
        int len = s.length();
        while (len > 0 && s.substring(len - 1, len).equals(" ")) {
            len--;
        }
        for (int i = len - 1; i >= 0; i--) {
            if (s.substring(i, i + 1).equals(" ")) {
                return len - 1 - i;
            }
        }
        return len;
    }

}

重复数组移除重复数据后的长度

package com.sly.uploadfile.algorithm;

/**
 * Created by fmgao on 2019/12/9.
 * <p>
 * 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
 * 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
 * <p>
 * 示例 1:
 * 给定数组 nums = [1,1,2],
 * 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。
 * 你不需要考虑数组中超出新长度后面的元素。
 */
public class RemoveDuplicates {

    public static void main(String[] args) {
        int[] nums = {1, 1, 2, 2, 3, 3, 3, 4, 4};
//        int i = removeDuplicates(nums);
//        System.out.println(i);
        System.out.println(removeDuplicates(nums));
    }


    public static int removeDuplicates(int[] nums) {
        if (nums.length == 0) {
            return 0;
        }
        int i = 0;
        for (int j = 1; j < nums.length; j++) {
            if (nums[j] != nums[i]) {
                i++;
                nums[i] = nums[j];
            }
        }
        return i + 1;
    }

    public static int removeDuplicates2(int[] nums) {
        if (nums.length <= 1) {
            return nums.length;
        }
        int cur = 1;
        for (int j = 1; j < nums.length; j++) {
            if (nums[j] != nums[cur - 1]) {
                nums[cur++] = nums[j];
            }
        }
        return cur;
    }

    public static int removeDuplicates3(int[] nums) {
        if (nums.length <= 2) {
            return nums.length;
        }
        int num = 1;
        int cur = 1;
        for (int i = 1; i < nums.length; i++) {
            if (nums[i] == nums[i - 1]) {
                if (num == 1) {
                    nums[cur++] = nums[i];
                }
                num++;
            } else {
                nums[cur++] = nums[i];
                num = 1;
            }
        }
        return cur;
    }

}

数字resverse

package com.sly.uploadfile.algorithm;

/**
 * Created by fmgao on 2019/7/1.
 */
public class ReverseIntNo {

    public static void main(String[] args) {
        int res = reverse(147483647);
        System.out.println(res);
        System.out.println(Integer.MAX_VALUE);
        System.out.println(147483647 % 10);
        System.out.println(147483647 / 10);
    }

    public static int reverse(int x) {

        long result = 0;

        while (x != 0) {
            result = result * 10 + x % 10;
            x /= 10;
        }

        if (result > Integer.MAX_VALUE || result < Integer.MIN_VALUE) {
            result = 0;
        }

        return (int) result;
    }
}

字符串转整数

package com.sly.uploadfile.algorithm;

/**
 * Created by fmgao on 2019/9/19.
 */

/**
 * 字符串转整数(atoi)
 * <p>
 * 实现 atoi,将字符串转为整数。
 * <p>
 * 在找到第一个非空字符之前,需要移除掉字符串中的空格字符。如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即为整数的值。如果第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
 * <p>
 * 字符串可以在形成整数的字符后面包括多余的字符,这些字符可以被忽略,它们对于函数没有影响。
 * <p>
 * 当字符串中的第一个非空字符序列不是个有效的整数;或字符串为空;或字符串仅包含空白字符时,则不进行转换。
 * <p>
 * 若函数不能执行有效的转换,返回 0。
 * <p>
 * 说明:
 * <p>
 * 假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231,  231 − 1]。如果数值超过可表示的范围,则返回  INT_MAX (231 − 1) 或 INT_MIN (−231) 。
 * <p>
 * 示例 1:
 * <p>
 * 输入: "42"
 * 输出: 42
 * <p>
 * 示例 2:
 * <p>
 * 输入: "   -42"
 * 输出: -42
 * 解释: 第一个非空白字符为 '-', 它是一个负号。
 * 我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。
 * <p>
 * 示例 3:
 * <p>
 * 输入: "4193 with words"
 * 输出: 4193
 * 解释: 转换截止于数字 '3' ,因为它的下一个字符不为数字。
 * <p>
 * 示例 4:
 * <p>
 * 输入: "words and 987"
 * 输出: 0
 * 解释: 第一个非空字符是 'w', 但它不是数字或正、负号。
 * 因此无法执行有效的转换。
 * <p>
 * 示例 5:
 * <p>
 * 输入: "-91283472332"
 * 输出: -2147483648
 * 解释: 数字 "-91283472332" 超过 32 位有符号整数范围。
 * 因此返回 INT_MIN (−231) 。
 */
public class StringToNum {

    public static void main(String[] args) {
        int res = myAtoi("      -357dhfjdk");
        System.out.println(res);
    }

    public static int myAtoi(String str) {
        int length = str.length();
        int index = 0;
        //先找到第一个非空的index
        while (index < length) {
            if (str.charAt(index) == ' ') {
                index++;
            } else {
                break;
            }
        }
        if (index == length) {
            return 0;
        }
        char now = str.charAt(index);
        int num = 0;
        //num要乘以isPositive
        int isPositive = 1;
        //去掉异常情况
        if (now != '+' && now != '-' && (now > '9' || now < '0')) {
            return 0;
        }
        if (now == '+') {
            index++;
        }
        if (now == '-') {
            isPositive = -1;
            index++;
        }
        // -2147483648  2147483647
        int maxValue_10 = Integer.MAX_VALUE / 10;
        int minValue_10 = Integer.MIN_VALUE / 10;
        while (index < length) {
            now = str.charAt(index);
            if (now > '9' || now < '0') {
                break;
            }
            int nowNum = now - '0';
            if (num > maxValue_10 || (num == maxValue_10 && nowNum > 7)) {
                num = Integer.MAX_VALUE;
                break;
            }
            if (num < minValue_10 || (num == minValue_10 && nowNum > 8)) {
                num = Integer.MIN_VALUE;
                break;
            }
            num = num * 10 + nowNum * isPositive;
            index++;
        }
        return num;
    }
}

无重复字符串最长字串

package com.sly.uploadfile.algorithm;

import java.util.LinkedList;

/**
 * Created by fmgao on 2019/9/2.
 * 给定一个字符串,找出不含有重复字符的最长子串的长度。
 * <p>
 * 示例:
 * <p>
 * 给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3。
 * <p>
 * 给定 "bbbbb" ,最长的子串就是 "b" ,长度是1。
 * <p>
 * 给定 "pwwkew" ,最长子串是 "wke" ,长度是3。请注意答案必须是一个子串,"pwke" 是 子序列  而不是子串
 */
public class Wucongfuzifuzuichangzichuan {
    public static void main(String[] args) {
        String s = "12345665432179456789";
        System.out.println(lengthOfLongestSubstring(s));
    }

    public static int lengthOfLongestSubstring(String s) {
        int num = 0;
        int current = 0;
        char[] arr = s.toCharArray();
        LinkedList<Character> temp = new LinkedList<>();
        for (int i = 0; i < arr.length; i++) {
            if (!temp.contains(arr[i])) {
                temp.add(arr[i]);
                current = temp.size();
                if (current > num) {
                    num = current;
                }
            } else {
                //如果新增字符与原子串中字符有重复的,删除原子串中重复字符及在它之前的字符,与新增字符组成新的子串
                temp.add(arr[i]);
                int first = temp.indexOf(arr[i]);
                for (int j = 0; j < first; j++) {
                    temp.remove();
                }
                temp.remove();
            }
        }
        return num;
    }
}

最长回文子串

package com.sly.uploadfile.algorithm;

/**
 * Created by admin on 2020/6/10.
 */
public class ZuiChangHuiWenZiChuan {

    public static void main(String[] args) {
        System.out.println(longestPalindrome("12345665432179456789"));
        System.out.println(longestPalindrome2("12345665432179456789"));
    }

    /**
     * 方法一:动态规划
     * 定义P(i,j):如果字符串从i位置到j位置是回文,P(i,j)=true;否则,P(i,j)=false;
     * 那么P(i,j)= P(i+1,j−1) && Si==Sj
     * 首先初始化一字母和二字母的回文:
     * P(i,i)=true P(i, i) = true P(i,i)=true
     * P(i,i+1)=(Si==Si+1)
     * 然后找到所有三字母回文,并依此类推…
     * 复杂度分析
     * 时间复杂度:O(n2)
     * 空间复杂度:O(n2), 该方法使用 O(n2) 的空间来存储表。
     *
     * @param s
     * @return
     */
    public static String longestPalindrome(String s) {
        if (s == null || s.length() <= 1) {
            return s;
        }
        int len = s.length();
        //flag[i][j]=true 表示子串i-j为回文字符串
        boolean[][] flags = new boolean[1000][1000];
        int start = 0;
        int maxlen = 0;
        for (int i = 0; i < len; i++) {
            flags[i][i] = true;
            if (maxlen == 0 || maxlen == 1) {
                start = i;
                maxlen = 1;
            }
            //相邻的两个字符相同
            if (i < len - 1 && s.charAt(i) == s.charAt(i + 1)) {
                flags[i][i + 1] = true;
                start = i;
                maxlen = 2;
            }
        }
        //m代表回文子串长度,从3开始
        for (int m = 3; m <= len; m++) {
            for (int i = 0; i <= len - m; i++) {
                //依次比较是否符合状态转移方程
                int j = i + m - 1;
                if (flags[i + 1][j - 1] && s.charAt(i) == s.charAt(j)) {
                    flags[i][j] = true;
                    start = i;
                    maxlen = m;
                }
            }
        }
        return s.substring(start, start + maxlen);
    }

    /**
     * 方法二:中心扩展算法
     * 事实上,只需使用恒定的空间,我们就可以在 O(n2)的时间内解决这个问题。
     * 回文中心的两侧互为镜像。因此,回文可以从它的中心展开
     *
     * @param s
     * @return
     */
    public static String longestPalindrome2(String s) {
        if (s == null || s.length() < 1) {
            return "";
        }
        int start = 0;
        int end = 0;
        for (int i = 0; i < s.length(); i++) {
            int len1 = expandAroundCenter(s, i, i);
            int len2 = expandAroundCenter(s, i, i + 1);
            int len = Math.max(len1, len2);
            if (len > end - start) {
                start = i - (len - 1) / 2;
                end = i + len / 2;
            }
        }
        return s.substring(start, end + 1);
    }

    private static int expandAroundCenter(String s, int left, int right) {
        int L = left, R = right;
        while (L >= 0 && R < s.length() && s.charAt(L) == s.charAt(R)) {
            L--;
            R++;
        }
        return R - L - 1;
    }

}
package com.util.companywork;

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

/**
 * Created by fmgao on 2019/8/31.
 */
public class DateThisTest {
    private int x;                  // 日期属性:年
    private int y;                  // 日期属性:月
    private int z;                  // 日期属性:日
    private Calendar localTime;     // 当前日期

    public DateThisTest() {
        localTime = Calendar.getInstance();
    }

    public static Calendar getCalendarByStr(String s) {
        Calendar calendar = Calendar.getInstance();
        try {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            Date date = format.parse(s);
            calendar = Calendar.getInstance();
            calendar.setTime(date);
            return calendar;
        } catch (ParseException e) {
            return calendar;
        }

    }

    /**
     * 功能:得到当前日期 格式为:xxxx-yy-zz (eg: 2007-12-05)<br>
     *
     * @return String
     * @author pure
     */
    public String today() {
        String strY = null;
        String strZ = null;
        x = localTime.get(Calendar.YEAR);
        y = localTime.get(Calendar.MONTH) + 1;
        z = localTime.get(Calendar.DATE);
        strY = y >= 10 ? String.valueOf(y) : ("0" + y);
        strZ = z >= 10 ? String.valueOf(z) : ("0" + z);
        return x + "-" + strY + "-" + strZ;
    }

    public String yestaday() {
        String strY = null;
        String strZ = null;
        x = localTime.get(Calendar.YEAR);
        y = localTime.get(Calendar.MONTH) + 1;
        z = localTime.get(Calendar.DATE) - 1;
        strY = y >= 10 ? String.valueOf(y) : ("0" + y);
        strZ = z >= 10 ? String.valueOf(z) : ("0" + z);
        return x + "-" + strY + "-" + strZ;
    }

    public String yestaday2() {
        Date today = new Date(System.currentTimeMillis() - 1000 * 60 * 60 * 24);
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");

        return simpleDateFormat.format(today);
    }

    public String yestaday2(String s) {
        try {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
            Date today = new Date(simpleDateFormat.parse(s).getTime() - 1000 * 60 * 60 * 24);
            String yesterday = simpleDateFormat.format(today);
            return yesterday;
        } catch (Exception e) {
            return null;
        }
    }

    // 上周一
    public String lastWeekMondayPre() {
        String strY = null;
        String strZ = null;
        x = localTime.get(Calendar.YEAR);
        y = localTime.get(Calendar.MONTH) + 1;
        z = localTime.get(Calendar.DATE) - 8;
        strY = y >= 10 ? String.valueOf(y) : ("0" + y);
        strZ = z >= 10 ? String.valueOf(z) : ("0" + z);
        return x + "-" + strY + "-" + strZ;
    }

    /**
     * 功能:得到当前月份月初 格式为:xxxx-yy-zz (eg: 2007-12-01)<br>
     *
     * @return String
     * @author pure
     */
    public String thisMonth() {
        String strY = null;
        x = localTime.get(Calendar.YEAR);
        y = localTime.get(Calendar.MONTH) + 1;
        strY = y >= 10 ? String.valueOf(y) : ("0" + y);
        return x + "-" + strY + "-01";
    }

    public String thisMonth(String s) {
        Calendar rr = getCalendarByStr(s);
        String strY = null;
        x = rr.get(rr.YEAR);
        y = rr.get(rr.MONTH) + 1;
        strY = y >= 10 ? String.valueOf(y) : ("0" + y);
        return x + "-" + strY + "-01";
    }

    public String nextMonth() {
        String strY = null;
        x = localTime.get(Calendar.YEAR);
        y = localTime.get(Calendar.MONTH) + 2;
        strY = y >= 10 ? String.valueOf(y) : ("0" + y);
        return x + "-" + strY + "-01";
    }

    public String nextMonth(String s) {
        Calendar rr = getCalendarByStr(s);
        String strY = null;
        x = rr.get(rr.YEAR);
        y = rr.get(rr.MONTH) + 2;
        if (y > 12) {
            y = y - 12;
            x = x + 1;
        }
        strY = y >= 10 ? String.valueOf(y) : ("0" + y);
        return x + "-" + strY + "-01";
    }

    public String nextMonth2(String s) {
        Calendar rr = getCalendarByStr(s);
        String strY = null;
        x = rr.get(rr.YEAR);
        y = rr.get(rr.MONTH) + 3;
        if (y > 12) {
            y = y - 12;
            x = x + 1;
        }
        strY = y >= 10 ? String.valueOf(y) : ("0" + y);
        return x + "-" + strY + "-01";
    }

    /**
     * 功能:得到当前月份月初 格式为:xxxx-yy-zz (eg: 2007-12-01)<br>
     *
     * @return String
     * @author pure
     */
    public String preMonth() {
        String strY = null;
        x = localTime.get(Calendar.YEAR);
        y = localTime.get(Calendar.MONTH) + 0;
        strY = y >= 10 ? String.valueOf(y) : ("0" + y);
        return x + "-" + strY + "-01";
    }

    /**
     * 功能:得到当前月份前月初 格式为:xxxx-yy-zz (eg: 2007-12-01)<br>
     *
     * @return String
     * @author pure
     */
    public String preMonth(String s) {
        Calendar rr = getCalendarByStr(s);
        String strY = null;
        x = rr.get(rr.YEAR);
        y = rr.get(rr.MONTH);
        if (y < 1) {
            y = 12;
            x = x - 1;
        }
        strY = y >= 10 ? String.valueOf(y) : ("0" + y);
        return x + "-" + strY + "-01";
    }

    public String preMonthEnd() {
        String strY = null;
        String strZ = null;
        boolean leap = false;
        x = localTime.get(Calendar.YEAR);
        y = localTime.get(Calendar.MONTH);
        if (y == 1 || y == 3 || y == 5 || y == 7 || y == 8 || y == 10 || y == 12) {
            strZ = "31";
        }
        if (y == 4 || y == 6 || y == 9 || y == 11) {
            strZ = "30";
        }
        if (y == 2) {
            leap = leapYear(x);
            if (leap) {
                strZ = "29";
            } else {
                strZ = "28";
            }
        }
        strY = y >= 10 ? String.valueOf(y) : ("0" + y);
        return x + "-" + strY + "-" + strZ;
    }

    public String preMonthEnd(String s) {
        Calendar rr = getCalendarByStr(s);
        String strY = null;
        String strZ = null;
        boolean leap = false;
        x = rr.get(rr.YEAR);
        y = rr.get(rr.MONTH);
        if (y < 1) {
            y = 12;
            x = x - 1;
        }
        if (y == 1 || y == 3 || y == 5 || y == 7 || y == 8 || y == 10 || y == 12) {
            strZ = "31";
        }
        if (y == 4 || y == 6 || y == 9 || y == 11) {
            strZ = "30";
        }
        if (y == 2) {
            leap = leapYear(x);
            if (leap) {
                strZ = "29";
            } else {
                strZ = "28";
            }
        }
        strY = y >= 10 ? String.valueOf(y) : ("0" + y);
        return x + "-" + strY + "-" + strZ;
    }

    /**
     * 功能:得到当前月份月底 格式为:xxxx-yy-zz (eg: 2007-12-31)<br>
     *
     * @return String
     * @author pure
     */
    public String thisMonthEnd() {
        String strY = null;
        String strZ = null;
        boolean leap = false;
        x = localTime.get(Calendar.YEAR);
        y = localTime.get(Calendar.MONTH) + 1;
        if (y == 1 || y == 3 || y == 5 || y == 7 || y == 8 || y == 10 || y == 12) {
            strZ = "31";
        }
        if (y == 4 || y == 6 || y == 9 || y == 11) {
            strZ = "30";
        }
        if (y == 2) {
            leap = leapYear(x);
            if (leap) {
                strZ = "29";
            } else {
                strZ = "28";
            }
        }
        strY = y >= 10 ? String.valueOf(y) : ("0" + y);
        return x + "-" + strY + "-" + strZ;
    }

    /**
     * 功能:得到当前月份月底 格式为:xxxx-yy-zz (eg: 2007-12-31)<br>
     *
     * @return String
     * @author pure
     */
    public String thisMonthEnd(String s) {
        Calendar rr = getCalendarByStr(s);
        String strY = null;
        String strZ = null;
        boolean leap = false;
        x = rr.get(rr.YEAR);
        y = rr.get(rr.MONTH) + 1;
        if (y == 1 || y == 3 || y == 5 || y == 7 || y == 8 || y == 10 || y == 12) {
            strZ = "31";
        }
        if (y == 4 || y == 6 || y == 9 || y == 11) {
            strZ = "30";
        }
        if (y == 2) {
            leap = leapYear(x);
            if (leap) {
                strZ = "29";
            } else {
                strZ = "28";
            }
        }
        strY = y >= 10 ? String.valueOf(y) : ("0" + y);
        return x + "-" + strY + "-" + strZ;
    }

    /**
     * 功能:得到当前月份下个月底 格式为:xxxx-yy-zz (eg: 2007-12-31)<br>
     *
     * @return String
     * @author pure
     */
    public String thisNextMonthEnd() {
        String strY = null;
        String strZ = null;
        boolean leap = false;
        x = localTime.get(Calendar.YEAR);
        y = localTime.get(Calendar.MONTH) + 2;
        if (y == 1 || y == 3 || y == 5 || y == 7 || y == 8 || y == 10 || y == 12) {
            strZ = "31";
        }
        if (y == 4 || y == 6 || y == 9 || y == 11) {
            strZ = "30";
        }
        if (y == 2) {
            leap = leapYear(x);
            if (leap) {
                strZ = "29";
            } else {
                strZ = "28";
            }
        }
        strY = y >= 10 ? String.valueOf(y) : ("0" + y);
        return x + "-" + strY + "-" + strZ;
    }

    /**
     * 功能:得到当前月份下个月底 格式为:xxxx-yy-zz (eg: 2007-12-31)<br>
     *
     * @return String
     * @author pure
     */
    public String thisNextMonthEnd(String s) {
        Calendar rr = getCalendarByStr(s);
        String strY = null;
        String strZ = null;
        boolean leap = false;
        x = rr.get(rr.YEAR);
        y = rr.get(rr.MONTH) + 2;
        if (y > 12) {
            y = y - 12;
            x = x + 1;
        }
        if (y == 1 || y == 3 || y == 5 || y == 7 || y == 8 || y == 10 || y == 12) {
            strZ = "31";
        }
        if (y == 4 || y == 6 || y == 9 || y == 11) {
            strZ = "30";
        }
        if (y == 2) {
            leap = leapYear(x);
            if (leap) {
                strZ = "29";
            } else {
                strZ = "28";
            }
        }
        strY = y >= 10 ? String.valueOf(y) : ("0" + y);
        return x + "-" + strY + "-" + strZ;
    }

    /**
     * 功能:得到当前月份三个个月底 格式为:xxxx-yy-zz (eg: 2007-12-31)<br>
     *
     * @return String
     * @author pure
     */
    public String thisThreeMonthEnd(String s) {
        Calendar rr = getCalendarByStr(s);
        String strY = null;
        String strZ = null;
        boolean leap = false;
        x = rr.get(rr.YEAR);
        y = rr.get(rr.MONTH) + 3;
        if (y > 12) {
            y = y - 12;
            x = x + 1;
        }
        if (y == 1 || y == 3 || y == 5 || y == 7 || y == 8 || y == 10 || y == 12) {
            strZ = "31";
        }
        if (y == 4 || y == 6 || y == 9 || y == 11) {
            strZ = "30";
        }
        if (y == 2) {
            leap = leapYear(x);
            if (leap) {
                strZ = "29";
            } else {
                strZ = "28";
            }
        }
        strY = y >= 10 ? String.valueOf(y) : ("0" + y);
        return x + "-" + strY + "-" + strZ;
    }

    /**
     * 功能:得到当前月份下个年的月底 格式为:xxxx-yy-zz (eg: 2007-12-31)<br>
     *
     * @return String
     * @author pure
     */
    public String thisNextYearMonthEnd() {
        String strY = null;
        String strZ = null;
        boolean leap = false;
        x = localTime.get(Calendar.YEAR) + 1;
        y = localTime.get(Calendar.MONTH) + 1;
        if (y == 1 || y == 3 || y == 5 || y == 7 || y == 8 || y == 10 || y == 12) {
            strZ = "31";
        }
        if (y == 4 || y == 6 || y == 9 || y == 11) {
            strZ = "30";
        }
        if (y == 2) {
            leap = leapYear(x);
            if (leap) {
                strZ = "29";
            } else {
                strZ = "28";
            }
        }
        strY = y >= 10 ? String.valueOf(y) : ("0" + y);
        return x + "-" + strY + "-" + strZ;
    }

    /**
     * 功能:得到当前月份下个年的月底 格式为:xxxx-yy-zz (eg: 2007-12-31)<br>
     *
     * @return String
     * @author pure
     */
    public String thisNextYearMonthEnd(String s) {
        Calendar rr = getCalendarByStr(s);
        String strY = null;
        String strZ = null;
        boolean leap = false;
        x = rr.get(rr.YEAR) + 1;
        y = rr.get(rr.MONTH) + 1;
        if (y == 1 || y == 3 || y == 5 || y == 7 || y == 8 || y == 10 || y == 12) {
            strZ = "31";
        }
        if (y == 4 || y == 6 || y == 9 || y == 11) {
            strZ = "30";
        }
        if (y == 2) {
            leap = leapYear(x);
            if (leap) {
                strZ = "29";
            } else {
                strZ = "28";
            }
        }
        strY = y >= 10 ? String.valueOf(y) : ("0" + y);
        return x + "-" + strY + "-" + strZ;
    }

    /**
     * 功能:得到当前季度季初 格式为:xxxx-yy-zz (eg: 2007-10-01)<br>
     *
     * @return String
     * @author pure
     */
    public String thisSeason() {
        String dateString = "";
        x = localTime.get(Calendar.YEAR);
        y = localTime.get(Calendar.MONTH) + 1;
        if (y >= 1 && y <= 3) {
            dateString = x + "-" + "01" + "-" + "01";
        }
        if (y >= 4 && y <= 6) {
            dateString = x + "-" + "04" + "-" + "01";
        }
        if (y >= 7 && y <= 9) {
            dateString = x + "-" + "07" + "-" + "01";
        }
        if (y >= 10 && y <= 12) {
            dateString = x + "-" + "10" + "-" + "01";
        }
        return dateString;
    }

    /**
     * 功能:得到当前季度季末 格式为:xxxx-yy-zz (eg: 2007-12-31)<br>
     *
     * @return String
     * @author pure
     */
    public String thisSeasonEnd() {
        String dateString = "";
        x = localTime.get(Calendar.YEAR);
        y = localTime.get(Calendar.MONTH) + 1;
        if (y >= 1 && y <= 3) {
            dateString = x + "-" + "03" + "-" + "31";
        }
        if (y >= 4 && y <= 6) {
            dateString = x + "-" + "06" + "-" + "30";
        }
        if (y >= 7 && y <= 9) {
            dateString = x + "-" + "09" + "-" + "30";
        }
        if (y >= 10 && y <= 12) {
            dateString = x + "-" + "12" + "-" + "31";
        }
        return dateString;
    }

    /**
     * 功能:得到当前季度季末 格式为:xxxx-yy-zz (eg: 2007-12-31)<br>
     *
     * @return String
     * @author pure
     */
    public String thisSeasonEnd(String s) {
        Calendar rr = getCalendarByStr(s);
        String dateString = "";
        x = rr.get(rr.YEAR);
        y = rr.get(rr.MONTH) + 1;
        if (y >= 1 && y <= 3) {
            dateString = x + "-" + "03" + "-" + "31";
        }
        if (y >= 4 && y <= 6) {
            dateString = x + "-" + "06" + "-" + "30";
        }
        if (y >= 7 && y <= 9) {
            dateString = x + "-" + "09" + "-" + "30";
        }
        if (y >= 10 && y <= 12) {
            dateString = x + "-" + "12" + "-" + "31";
        }
        return dateString;
    }

    /**
     * 功能:得到当前年份年初 格式为:xxxx-yy-zz (eg: 2007-01-01)<br>
     *
     * @return String
     * @author pure
     */
    public String thisYear() {
        x = localTime.get(Calendar.YEAR);
        return x + "-01" + "-01";
    }

    public String thisYear(String s) {
        Calendar rr = getCalendarByStr(s);
        x = rr.get(rr.YEAR);
        return x + "-01" + "-01";
    }

    public String nextYear() {
        x = localTime.get(Calendar.YEAR) + 1;
        return x + "-01" + "-01";
    }

    public String nextYear(String s) {
        Calendar rr = getCalendarByStr(s);
        x = rr.get(rr.YEAR) + 1;
        return x + "-01" + "-01";
    }


    /**
     * 功能:得到当前年份年底 格式为:xxxx-yy-zz (eg: 2007-12-31)<br>
     *
     * @return String
     * @author pure
     */
    public String thisYearEnd(String s) {
        Calendar rr = getCalendarByStr(s);
        x = localTime.get(rr.YEAR);
        return x + "-12" + "-31";
    }

    /**
     * 功能:得到当前年份年底 格式为:xxxx-yy-zz (eg: 2007-12-31)<br>
     *
     * @return String
     * @author pure
     */
    public String thisYearEnd() {
        x = localTime.get(Calendar.YEAR);
        return x + "-12" + "-31";
    }

    /**
     * 功能:判断输入年份是否为闰年<br>
     *
     * @param year
     * @return 是:true  否:false
     * @author pure
     */
    public boolean leapYear(int year) {
        boolean leap;
        if (year % 4 == 0) {
            if (year % 100 == 0) {
                if (year % 400 == 0) leap = true;
                else leap = false;
            } else leap = true;
        } else leap = false;
        return leap;
    }

    /**
     * 判断一天是否是周末
     *
     * @param d
     * @return
     */
    public boolean checkWeekendDay(Date d) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(d);
        if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY || cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
            return true;
        }
        return false;
    }
}

timeUtil

package com..common.util;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * 时间工具类
 */
public class TimeUtils {

    private TimeUtils() {
    }

    private static final String YYYY = "yyyy-MM-dd";
    private static final String YYYYHH = "yyyy-MM-dd HH:mm:ss";

    /**
     * 取得yyyy-MM-dd HH:mm:ss格式的时间
     *
     * @return
     */
    public static String yyyyMMddHHmmss(Date date) {
        return dateFormat4yyyyMMddHHmmss().format(date);
    }


    public static Date yyyyMMdd(String formatdate) {
        try {
            return dateFormat4yyyyMMdd().parse(formatdate);
        } catch (Exception e) {
            throw new IllegalStateException(formatdate, e);
        }
    }

    public static String yyyyMMdd(Date date) {
        return dateFormat4yyyyMMdd().format(date);
    }

    public static String format(DateFormat format, Date date) {
        try {
            return format.format(date);
        } catch (Exception e) {
            throw new IllegalArgumentException(date.toString(), e);
        }
    }


    /**
     * @return
     */
    public static SimpleDateFormat dateFormat4yyyyMMddHHmmss() {
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    }


    /**
     * @return yyyy-MM-dd格式
     */
    public static SimpleDateFormat dateFormat4yyyyMMdd() {
        return new SimpleDateFormat("yyyy-MM-dd");
    }

    /**
     * 将字符串格式yyyyMMdd的字符串转为日期,格式"yyyy-MM-dd"
     *
     * @param date 日期字符串
     * @return 返回格式化的日期
     * @throws ParseException 分析时意外地出现了错误异常
     */
    public static String strToDateFormat(String date) {
        try {
            if (StringUtils.isEmpty(date)) {
                return date;
            }
            SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
            formatter.setLenient(false);
            Date newDate = formatter.parse(date);
            formatter = new SimpleDateFormat("yyyy-MM-dd");
            return formatter.format(newDate);
        } catch (ParseException e) {
            throw new IllegalStateException(date, e);
        }
    }

    /**
     * 当前季度的开始时间,即2012-01-1 00:00:00
     *
     * @return
     */
    public static Date getCurrentQuarterStartTime(Date nowDate) throws Exception {
        SimpleDateFormat longSdf = new SimpleDateFormat(YYYYHH);
        SimpleDateFormat shortSdf = new SimpleDateFormat(YYYY);
        Calendar c = Calendar.getInstance();
        c.setTime(nowDate);
        int currentMonth = c.get(Calendar.MONTH) + 1;
        Date now = null;
        if (currentMonth >= 1 && currentMonth <= 3)
            c.set(Calendar.MONTH, 0);
        else if (currentMonth >= 4 && currentMonth <= 6)
            c.set(Calendar.MONTH, 3);
        else if (currentMonth >= 7 && currentMonth <= 9)
            c.set(Calendar.MONTH, 6);
        else if (currentMonth >= 10 && currentMonth <= 12)
            c.set(Calendar.MONTH, 9);
        c.set(Calendar.DATE, 1);
        now = longSdf.parse(shortSdf.format(c.getTime()) + " 00:00:00");
        return now;
    }

    /**
     * 当前半年的开始时间,即2012-01-01 00:00:00,2012-06-01 00:00:00
     *
     * @return
     */
    public static Date getCurrentYearStartTime(Date nowDate) throws Exception {
        SimpleDateFormat longSdf = new SimpleDateFormat(YYYYHH);
        SimpleDateFormat shortSdf = new SimpleDateFormat(YYYY);
        Calendar c = Calendar.getInstance();
        c.setTime(nowDate);
        int currentMonth = c.get(Calendar.MONTH) + 1;
        if (currentMonth >= 1 && currentMonth <= 6)
            c.set(Calendar.MONTH, 0);
        else if (currentMonth >= 7 && currentMonth <= 12)
            c.set(Calendar.MONTH, 6);
        c.set(Calendar.DATE, 1);
        Date now = longSdf.parse(shortSdf.format(c.getTime()) + " 00:00:00");
        return now;
    }

    /**
     * 当前半年的结束时间,即2012-06-30 23:59:59,2012-12-31 23:59:59
     *
     * @return
     */
    public static Date getCurrentYearEndTime(Date nowDate) throws Exception {
        SimpleDateFormat longSdf = new SimpleDateFormat(YYYYHH);
        SimpleDateFormat shortSdf = new SimpleDateFormat(YYYY);
        Calendar c = Calendar.getInstance();
        c.setTime(nowDate);
        int currentMonth = c.get(Calendar.MONTH) + 1;
        if (currentMonth >= 1 && currentMonth <= 6) {
            c.set(Calendar.MONTH, 5);
            c.set(Calendar.DATE, 30);
        } else if (currentMonth >= 7 && currentMonth <= 12) {
            c.set(Calendar.MONTH, 11);
            c.set(Calendar.DATE, 31);
        }
        Date now = longSdf.parse(shortSdf.format(c.getTime()) + " 23:59:59");
        return now;
    }

    /**
     * 当月第一天,即2012-03-31 23:59:59
     *
     * @return
     */
    public static Date getCurrentMonthMiddleday(Date nowDate) {
        // 获取当月第一天和最后一天
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        // 获取前月的第一天
        Calendar cale = Calendar.getInstance();
        cale.setTime(nowDate);
        cale.add(Calendar.MONTH, 0);
        cale.set(Calendar.DAY_OF_MONTH, 15);
        String firstday = format.format(cale.getTime());
        System.out.println("firstday = " + firstday);
        return cale.getTime();
    }


    /**
     * 当前季度的结束时间,即2012-03-31 23:59:59
     *
     * @return
     */
    public static Date getCurrentQuarterEndTime(Date nowDate) throws Exception {
        SimpleDateFormat longSdf = new SimpleDateFormat(YYYYHH);
        SimpleDateFormat shortSdf = new SimpleDateFormat(YYYY);
        Calendar c = Calendar.getInstance();
        c.setTime(nowDate);
        int currentMonth = c.get(Calendar.MONTH) + 1;
        Date now = null;
        if (currentMonth >= 1 && currentMonth <= 3) {
            c.set(Calendar.MONTH, 2);
            c.set(Calendar.DATE, 31);
        } else if (currentMonth >= 4 && currentMonth <= 6) {
            c.set(Calendar.MONTH, 5);
            c.set(Calendar.DATE, 30);
        } else if (currentMonth >= 7 && currentMonth <= 9) {
            c.set(Calendar.MONTH, 8);
            c.set(Calendar.DATE, 30);
        } else if (currentMonth >= 10 && currentMonth <= 12) {
            c.set(Calendar.MONTH, 11);
            c.set(Calendar.DATE, 31);
        }
        now = longSdf.parse(shortSdf.format(c.getTime()) + " 23:59:59");
        return now;
    }

    /**
     * 当年中间的一天,即2019-06-30
     *
     * @return
     */
    public static Date getMiddleDayOfYear(Date nowDate) {
        // 获取前月的第一天
        Calendar cale = Calendar.getInstance();
        cale.setTime(nowDate);
        cale.set(Calendar.MONTH, 5);
        cale.set(Calendar.DAY_OF_MONTH, 30);
        return cale.getTime();
    }

    /**
     * 当年尾的一天,即2019-12-31
     *
     * @return
     */
    public static Date getEndDayOfYear(Date nowDate) {
        // 获取前月的第一天
        Calendar cale = Calendar.getInstance();
        cale.setTime(nowDate);
        cale.set(Calendar.MONTH, 11);
        cale.set(Calendar.DAY_OF_MONTH, 31);
        return cale.getTime();
    }

    /**
     * 获取制定年月的 日历工作天数
     *
     * @param year
     * @param month
     * @return
     */
    public static List<String> getDates(int year, int month) {
        List<String> dates = new ArrayList<>();
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.YEAR, year);
        cal.set(Calendar.MONTH, month - 1);
        cal.set(Calendar.DATE, 1);

        while (cal.get(Calendar.YEAR) == year &&
                cal.get(Calendar.MONTH) < month) {
            int day = cal.get(Calendar.DAY_OF_WEEK);

            if (!(day == Calendar.SUNDAY || day == Calendar.SATURDAY)) {
                dates.add(TimeUtils.yyyyMMdd((Date) cal.getTime().clone()));
            }
            cal.add(Calendar.DATE, 1);
        }
        return dates;

    }

    /**
     * 获取制定年月获取一年的周末
     *
     * @param year
     * @return
     */
    public static List<String> getDatesWeekend(int year) {
        List<String> dates = new ArrayList<>();
        Calendar c = Calendar.getInstance();
        c.set(year, 0, 1);
        Calendar c2 = Calendar.getInstance();
        c2.set(year + 1, 0, 1);
        while (c.compareTo(c2) < 0) {
            if (c.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY || c.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
                dates.add(TimeUtils.yyyyMMdd((Date) c.getTime().clone()));
            }
            // 日期+1
            c.add(Calendar.DATE, 1);
        }
        return dates;
    }

}

 

posted on 2020-06-20 17:06  风-fmgao  阅读(93)  评论(0编辑  收藏  举报