PHP's strtotime() in Java

后端 未结 5 1178
终归单人心
终归单人心 2020-11-28 09:42

strtotime() in PHP can do the following transformations:

Inputs:

strtotime(’2004-02-12T15:19:21+00:00′);
strtotime(’Thu, 21 Dec 2000 16:01:07 +0200′);
str         


        
相关标签:
5条回答
  • 2020-11-28 09:47

    You can use Simple Date format for such a thing, but you must know the date format before parsing the string. PHP will try to guess it, Java expects you tell him explicitly what to do.

    Example :

    SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    SimpleDateFormat formater = new SimpleDateFormat("MM/dd/yy");
    Date d = parser.parse("2007-04-23 11:22:02");
    System.out.println(formater.format(d));
    

    It outputs :

    04/23/2007
    

    SimpleDateFormat will fail silently if the string is not in the proper format, unless you set :

    parser.setLenient(false);
    

    In that case, it will throws java.text.ParseException.

    For advance formating, use the DateFormat and it's numerous operators.

    0 讨论(0)
  • 2020-11-28 09:48

    Look at JodaTime, i think it is best datetime library for java.

    0 讨论(0)
  • 2020-11-28 09:58

    I tried to implement a simple (static) class that emulates some of the patterns of PHP's strtotime. This class is designed to be open for modification (simply add a new Matcher via registerMatcher):

    public final class strtotime {
    
        private static final List<Matcher> matchers;
    
        static {
            matchers = new LinkedList<Matcher>();
            matchers.add(new NowMatcher());
            matchers.add(new TomorrowMatcher());
            matchers.add(new DateFormatMatcher(new SimpleDateFormat("yyyy.MM.dd G 'at' HH:mm:ss z")));
            matchers.add(new DateFormatMatcher(new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z")));
            matchers.add(new DateFormatMatcher(new SimpleDateFormat("yyyy MM dd")));
            // add as many format as you want 
        }
    
        // not thread-safe
        public static void registerMatcher(Matcher matcher) {
            matchers.add(matcher);
        }
    
        public static interface Matcher {
    
            public Date tryConvert(String input);
        }
    
        private static class DateFormatMatcher implements Matcher {
    
            private final DateFormat dateFormat;
    
            public DateFormatMatcher(DateFormat dateFormat) {
                this.dateFormat = dateFormat;
            }
    
            public Date tryConvert(String input) {
                try {
                    return dateFormat.parse(input);
                } catch (ParseException ex) {
                    return null;
                }
            }
        }
    
        private static class NowMatcher implements Matcher {
    
            private final Pattern now = Pattern.compile("now");
    
            public Date tryConvert(String input) {
                if (now.matcher(input).matches()) {
                    return new Date();
                } else {
                    return null;
                }
            }
        }
    
        private static class TomorrowMatcher implements Matcher {
    
            private final Pattern tomorrow = Pattern.compile("tomorrow");
    
            public Date tryConvert(String input) {
                if (tomorrow.matcher(input).matches()) {
                    Calendar calendar = Calendar.getInstance();
                    calendar.add(Calendar.DAY_OF_YEAR, +1);
                    return calendar.getTime();
                } else {
                    return null;
                }
            }
        }
    
        public static Date strtotime(String input) {
            for (Matcher matcher : matchers) {
                Date date = matcher.tryConvert(input);
    
                if (date != null) {
                    return date;
                }
            }
    
            return null;
        }
    
        private strtotime() {
            throw new UnsupportedOperationException();
        }
    }
    

    Usage

    Basic usage:

     Date now = strtotime("now");
     Date tomorrow = strtotime("tomorrow");
    
    Wed Aug 12 22:18:57 CEST 2009
    Thu Aug 13 22:18:57 CEST 2009
    

    Extending

    For example let's add days matcher:

    strtotime.registerMatcher(new Matcher() {
    
        private final Pattern days = Pattern.compile("[\\-\\+]?\\d+ days");
    
        public Date tryConvert(String input) {
    
            if (days.matcher(input).matches()) {
                int d = Integer.parseInt(input.split(" ")[0]);
                Calendar calendar = Calendar.getInstance();
                calendar.add(Calendar.DAY_OF_YEAR, d);
                return calendar.getTime();
            }
    
            return null;
        }
    });
    

    then you can write:

    System.out.println(strtotime("3 days"));
    System.out.println(strtotime("-3 days"));
    

    (now is Wed Aug 12 22:18:57 CEST 2009)

    Sat Aug 15 22:18:57 CEST 2009
    Sun Aug 09 22:18:57 CEST 2009
    
    0 讨论(0)
  • 2020-11-28 09:58

    Use a Calendar and format the result with SimpleDateFormat:

    http://java.sun.com/j2se/1.5.0/docs/api/java/util/Calendar.html

        Calendar now = Calendar.getInstance();
        Calendar working;
        SimpleDateFormat formatter = new SimpleDateFormat("E yyyy.MM.dd 'at' hh:mm:ss a zzz");
    
        working = (Calendar) now.clone();
    
        //strtotime("-2 years")
        working.add(Calendar.DAY_OF_YEAR, - (365 * 2));
        System.out.println("  Two years ago it was: " + formatter.format(working.getTime()));
    
        working = (Calendar) now.clone();
    
        //strtotime("+5 days");
        working.add(Calendar.DAY_OF_YEAR, + 5);
        System.out.println("  In five days it will be: " + formatter.format(working.getTime()));
    

    Fine, it's significantly more verbose than PHP's strtotime(), but at the end of the day, it's the functionality you're after.

    0 讨论(0)
  • 2020-11-28 10:08

    As far as I know, nothing like this exists. You would have to hack one together yourself. However, it might not be necessary. Try storing the dates as timestamps and just doing the simple math. I understand this isn't as clean as you might like. But it would work.

    0 讨论(0)
提交回复
热议问题