首页javadateJava Data Type - 如何创建枚举以表示各种下一持续时间,小时,周,月,年

Java Data Type - 如何创建枚举以表示各种下一持续时间,小时,周,月,年

我们想知道如何创建枚举以表示各种下一持续时间,小时,周,月,年。
/*
 * JLibs: Common Utilities for Java
 * Copyright (C) 2009  Santhosh Kumar T <santhosh.tekuri@gmail.com>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 */

//package jlibs.nio.util;

import java.text.SimpleDateFormat;
import java.time.Clock;
import java.time.DayOfWeek;
import java.time.Instant;
import java.time.ZonedDateTime;
import java.time.temporal.TemporalAdjusters;
import java.util.Date;

/**
 * @author Santhosh
 */
public enum RepeatingDuration{
    HOURLY{
        protected long next(ZonedDateTime zdt){
            return  zdt.plusHours(1)
                    .withMinute(0).withSecond(0).withNano(0)
                    .toInstant().toEpochMilli();
        }
    },
    DAILY{
        protected long next(ZonedDateTime zdt){
            return zdt.plusDays(1)
                    .withHour(0).withMinute(0).withSecond(0).withNano(0)
                    .toInstant().toEpochMilli();
        }
    },
    WEEKLY{
        protected long next(ZonedDateTime zdt){
            return zdt.plusWeeks(1).with(DayOfWeek.SUNDAY)
                    .withHour(0).withMinute(0).withSecond(0).withNano(0)
                    .toInstant().toEpochMilli();
        }
    },
    MONTHLY{
        protected long next(ZonedDateTime zdt){
            return zdt.with(TemporalAdjusters.firstDayOfNextMonth())
                    .withHour(0).withMinute(0).withSecond(0).withNano(0)
                    .toInstant().toEpochMilli();
        }
    },
    YEARLY{
        protected long next(ZonedDateTime zdt){
            return zdt.with(TemporalAdjusters.firstDayOfNextYear())
                    .withHour(0).withMinute(0).withSecond(0).withNano(0)
                    .toInstant().toEpochMilli();
        }
    };

    protected abstract long next(ZonedDateTime zdt);

    public long next(long from){
        return next(ZonedDateTime.ofInstant(Instant.ofEpochMilli(from), Clock.systemDefaultZone().getZone()));
    }

    public long next(){
        return next(ZonedDateTime.now());
    }

    public static RepeatingDuration forFormat(String format){
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        Date date = new Date();
        String valueNow = sdf.format(date);

        for(RepeatingDuration rd: values()){
            if(!sdf.format(new Date(rd.next(date.getTime()))).equals(valueNow))
                return rd;
        }
        return null;
    }
}