Parse, validate, manipulate, and display dates in PHP w/ i18n support. Inspired by moment.js

Overview

Support

I am a dad now for the last 1,5 years and that clearly shows in being on time with merging PRs or pushing this package further. Time is the biggest constraint here. I would be happy to pass the project on to somebody who has more time and the motivation to push the project forward. Just drop me a message. Cheers!

                                      _           _           
 _ __ ___   ___  _ __ ___   ___ _ __ | |_   _ __ | |__  _ __  
| '_ ` _ \ / _ \| '_ ` _ \ / _ \ '_ \| __| | '_ \| '_ \| '_ \
| | | | | | (_) | | | | | |  __/ | | | |_ _| |_) | | | | |_) |
|_| |_| |_|\___/|_| |_| |_|\___|_| |_|\__(_) .__/|_| |_| .__/
                                           |_|         |_|    

Build Status Total Downloads

Change log

Intro

What is moment.php?

Date library for parsing, manipulating and formatting dates w/ i18n.

Any dependencies?

PHP 5.3 or later since moment.php is based on php's DateTime Class.


Install

Easy install via composer. Still no idea what composer is? Inform yourself here.

composer require fightbulc/moment

Quick examples

Get a moment

$m = new \Moment\Moment(); // default is "now" UTC
echo $m->format(); // e.g. 2012-10-03T10:00:00+0000

$m = new \Moment\Moment('now', 'Europe/Berlin');
echo $m->format(); // e.g. 2012-10-03T12:00:00+0200

$m = new \Moment\Moment('2017-06-06T10:00:00', 'Europe/Berlin');
echo $m->format(); // e.g. 2012-10-03T12:00:00+0200

$m = new \Moment\Moment(1499366585);
echo $m->format(); // e.g. 2017-07-06T18:43:05+0000

Accepted date formats

Moment parses the following date formats as input:

const ATOM = 'Y-m-d\TH:i:sP'; // 2005-08-15T15:52:01+00:00
const COOKIE = 'l, d-M-y H:i:s T'; // Monday, 15-Aug-2005 15:52:01 UTC
const ISO8601 = 'Y-m-d\TH:i:sO'; // 2005-08-15T15:52:01+0000
const RFC822 = 'D, d M y H:i:s O'; // Mon, 15 Aug 05 15:52:01 +0000
const RFC850 = 'l, d-M-y H:i:s T'; // Monday, 15-Aug-05 15:52:01 UTC
const RFC1036 = 'D, d M y H:i:s O'; // Mon, 15 Aug 05 15:52:01 +0000
const RFC1123 = 'D, d M Y H:i:s O'; // Mon, 15 Aug 2005 15:52:01 +0000
const RFC2822 = 'D, d M Y H:i:s O'; // Mon, 15 Aug 2005 15:52:01 +0000
const RSS = 'D, d M Y H:i:s O'; // Mon, 15 Aug 2005 15:52:01 +0000
const W3C = 'Y-m-d\TH:i:sP'; // 2005-08-15T15:52:01+00:00

// Moment also tries to parse dates without timezone or without seconds

const NO_TZ_MYSQL = 'Y-m-d H:i:s'; // 2005-08-15 15:52:01
const NO_TZ_NO_SECS = 'Y-m-d H:i'; // 2005-08-15 15:52
const NO_TIME = 'Y-m-d'; // 2005-08-15

// time fractions ".000" will be automatically removed
$timeWithFraction = '2016-05-04T10:00:00.000';

Switch locale

Have a look at the Locales folder to see all supported languages. Default locale is en_GB.

$m = new \Moment\Moment();
echo $m->format('[Weekday:] l'); // e.g. Weekday: Wednesday

// set german locale
\Moment\Moment::setLocale('de_DE');

$m = new \Moment\Moment();
echo $m->format('[Wochentag:] l'); // e.g. Wochentag: Mittwoch

Supported languages so far:

ar_TN Arabic (Tunisia)
ca_ES Catalan
zh_CN Chinese
zh_TW Chinese (traditional)
cs_CZ Czech
da_DK Danish
nl_NL Dutch
en_CA English (Canada)
en_GB English (British)
en_US English (American)
eo_EO Esperanto
fa_IR Farsi
fi_FI Finnish
fr_FR French (Europe)
fr_CA French (Canada)
de_DE German (Germany)
hu_HU Hungarian
id_ID Indonesian
it_IT Italian
ja_JP Japanese
kz_KZ Kazakh
oc_LNC Lengadocian
lv_LV Latvian (Latviešu)
pl_PL Polish
pt_BR Portuguese (Brazil)
pt_PT Portuguese (Portugal)
ru_RU Russian (Basic version)
es_ES Spanish (Europe)
sv_SE Swedish
uk_UA Ukrainian
th_TH Thai
tr_TR Turkish
vi_VN Vietnamese


Switch timezones

$m = new \Moment\Moment('2012-04-25T03:00:00', 'CET');
echo $m->setTimezone('UTC')->format(); // 2012-04-25T01:00:00+0000

Change default timezone

\Moment\Moment::setDefaultTimezone('CET');

$m = new \Moment\Moment('2016-09-13T14:32:06');
echo $m->format(); // 2016-09-13T14:32:06+0100

Custom format

I. PHP only (Standard)

$m = new \Moment\Moment('2012-04-25T03:00:00', 'CET');
echo $m->format('l, dS F Y / H:i (e)'); // Wednesday, 25th April 2012 / 03:00 (Europe/Berlin)

Formats are based on PHP's Date function and DateTime class.

II. Non-php formats

You can now inject different format handling by passing along a class which implements the FormatsInterface. You can find an example within the test folder for implementing all formats from moment.js. Thanks to Ashish for taking the time to match moment.js formats to those of PHP. Have a look at the test script to see the example in action.

Everybody can write format classes in the same manner. Its easy and scalable.

// get  desired formats class
// create a moment
$m = new \Moment\Moment('2012-04-25T03:00:00', 'CET');

// format with moment.js definitions
echo $m->format('LLLL', new \Moment\CustomFormats\MomentJs()); // Wednesday, April 25th 2012 3:00 AM

Custom formats can also come as part of every Locale. If it does not exist for your locale yet go ahead and add it. See an example for the French locale.

III. Easy text escaping

Just wrap all your text within [] and all characters will be automatically escaped for you.

$m = new \Moment\Moment('2012-04-25T03:00:00', 'CET');
echo $m->format('[We are in the month of:] F'); // We are in the month of: April

IV. Fixed ordinal representations

PHP's interal ordinal calculation seems to be buggy. I added a quick fix to handle this issue.

The following example prints the week of the year of the given date. It should print 22nd:

// internal function
date('WS', mktime(12, 22, 0, 5, 27, 2014)); // 22th

// moment.php
$m = new \Moment\Moment('2014-05-27T12:22:00', 'CET');
$m->format('WS'); // 22nd

Create custom moments and manipulate it

I. Past/Future moments

$m = new \Moment\Moment('2012-05-15T12:30:00', 'CET');
echo $m->addHours(2)->format(); // 2012-05-15T14:30:00+0200

$m = new \Moment\Moment('2012-05-15T12:30:00', 'CET');
echo $m->subtractDays(7)->subtractMinutes(15)->format(); // 2012-05-08T12:15:00+0200

$m = new \Moment\Moment('@1401443979', 'CET'); // unix time
echo $m->subtractDays(7)->subtractMinutes(15)->format(); // 2014-05-23T09:44:39+0000

II. Clone a given moment

Sometimes its useful to take a given moment and work with it without changing the origin. For that use cloning().

$m = new \Moment\Moment('2012-05-15T12:30:00', 'CET');
$c = $m->cloning()->addDays(1);

echo $m->getDay(); // 15
echo $c->getDay(); // 16

Alternately, you can enable immutable mode on the origin.

$m = new \Moment\Moment('2012-05-15T12:30:00', 'CET', true);
$c = $m->addDays(1);

echo $m->getDay(); // 15
echo $c->getDay(); // 16

// You can also change the immutable mode after creation:
$m->setImmutableMode(false)->subtractDays(1);

echo $m->getDay(); // 14

Immutable mode makes all modification methods call cloning() implicitly before applying their modifications.

III. Methods for manipulating the date/time

Add Subtract
addSeconds($s) subtractSeconds($s)
addMinutes($i) subtractMinutes($i)
addHours($h) subtractHours($h)
addDays($d) subtractDays($d)
addWeeks($w) subtractWeeks($w)
addMonths($m) subtractMonths($m)
addYears($y) subtractYears($y)

IV. Setter/Getter

Setter Getter
setSecond($s) getSecond()
setMinute($m) getMinute()
setHour($h) getHour()
setDay($d) getDay()
setMonth($m) getMonth()
setYear($y) getYear()
-- getQuarter()

Difference between dates

$m = new \Moment\Moment('2013-02-01T07:00:00');
$momentFromVo = $m->fromNow();

// or from a specific moment
$m = new \Moment\Moment('2013-02-01T07:00:00');
$momentFromVo = $m->from('2011-09-25T10:00:00');

// result comes as a value object class
echo $momentFromVo->getDirection()  // "future"
echo $momentFromVo->getSeconds()    // -42411600
echo $momentFromVo->getMinutes()    // -706860
echo $momentFromVo->getHours()      // -11781
echo $momentFromVo->getDays()       // -490.88
echo $momentFromVo->getWeeks()      // -70.13
echo $momentFromVo->getMonths()     // -17.53
echo $momentFromVo->getYears()      // -1.42
echo $momentFromVo->getRelative()   // in a year

Get date periods (week, month, quarter)

Sometimes its helpful to get the period boundaries of a given date. For instance in case that today is Wednesday and I need the starting-/end dates from today's week. Allowed periods are week, month and quarter.

$m = new \Moment\Moment('2013-10-23T10:00:00');
$momentPeriodVo = $m->getPeriod('week');

// results comes as well as a value object class
echo $momentPeriodVo
    ->getStartDate()
    ->format('Y-m-d'); // 2013-10-21

echo $momentPeriodVo
    ->getEndDate()
    ->format('Y-m-d'); // 2013-10-27

echo $momentPeriodVo
    ->getRefDate()
    ->format('Y-m-d'); // 2013-10-23

echo $momentPeriodVo->getInterval(); // 43 = week of year

Same procedure for monthly and quarterly periods:

$momentPeriodVo = $m->getPeriod('month');
$momentPeriodVo = $m->getPeriod('quarter');

Calendar Times

Calendar time displays time relative to now, but slightly differently than Moment::fromNow(). Moment::calendar() will format a date with different strings depending on how close to today the date is.

(new \Moment\Moment('2014-03-30T16:58:00', 'CET'))->subtractDays(6)->calendar(); // last week
(new \Moment\Moment('2014-03-30T16:58:00', 'CET'))->subtractDays(1)->calendar(); // yesterday
(new \Moment\Moment('2014-03-30T16:58:00', 'CET'))->calendar(); // today
(new \Moment\Moment('2014-03-30T16:58:00', 'CET'))->addDays(1)->calendar(); // tomorrow
(new \Moment\Moment('2014-03-30T16:58:00', 'CET'))->addDays(3)->calendar(); // next week
(new \Moment\Moment('2014-03-30T16:58:00', 'CET'))->addDays(10)->calendar(); // everything else
Time Display
Last week Last Monday at 15:54
The day before Yesterday at 15:54
The same day Today at 15:54
The next day Tomorrow at 15:54
The next week Wednesday at 15:54
Everything else 04/09/2014

Note: Use $moment->calendar(false) to leave out the time at 00:00.


startOf / endOf

Same process as for moment.js: mutates the original moment by setting it to the start/end of a unit of time.

$m = new \Moment\Moment('20140515T10:15:23', 'CET');

$m->startOf('year');    // set to January 1st, 00:00 this year
$m->startOf('quarter'); // set to the beginning of the current quarter, 1st day of months, 00:00
$m->startOf('month');   // set to the first of this month, 00:00
$m->startOf('week');    // set to the first day of this week, 00:00
$m->startOf('day');     // set to 00:00 today
$m->startOf('hour');    // set to now, but with 0 mins, 0 secs
$m->startOf('minute');  // set to now, but with 0 seconds

$m->endOf('year');    // set to December 31st, 23:59 this year
$m->endOf('quarter'); // set to the end of the current quarter, last day of month, 23:59
$m->endOf('month');   // set to the last of this month, 23:59
$m->endOf('week');    // set to the last day of this week, 23:59
$m->endOf('day');     // set to 23:59 today
$m->endOf('hour');    // set to now, but with 59 mins, 59 secs
$m->endOf('minute');  // set to now, but with 59 seconds

Note: I ignored the period of second since we are not dealing with milliseconds.


Get dates for given weekdays for upcoming weeks

For one of my customers I needed to get moments by selected weekdays. The task was: give me the dates for Tuesdays and Thursdays for the next three weeks. So I added a small handler which does exactly this. As result you will receive an array filled with Moment Objects.

// 1 - 7 = Mon - Sun
$weekdayNumbers = [
    2, // tuesday
    4, // thursday
];

$m = new \Moment\Moment();
$dates = $m->getMomentsByWeekdays($weekdayNumbers, 3);

// $dates = [Moment, Moment, Moment ...]

You can now run through the result and put it formatted into a drop-down field or for whatever you might need it.


Roadmap

  • Try to port useful methods from moment.js
  • Add unit tests

Change Log

1.33.0

  • fixed:
    • French locale
    • Canadian tests
  • added:
    • Esperanto locale
    • Kazakh locale

1.32.1

  • fixed:
    • DateTime::createFromFormat signature match

1.32.0

  • added:
    • Farsi locale

1.31.0

  • added:
    • code checks vis GH action workflows
    • Canadian locale for English/French

1.30.1

  • fixed:
    • merge with a couple of PRs (thanks!)

1.30.0

  • added:
    • Finish locale
  • fixed:
    • Swedish locale

1.29.0

  • updated Italian locale
  • added:
    • custom formats for en_US
    • flag for loading similar locale

1.28.3

  • fixed typehint issue

1.28.2

  • fixed:
    • missing relativeTime format
    • allow 9-digit unixtime

1.28.1

  • fixed RFC2822 as valid format

1.28.0

  • fixed relative time
  • added Norwegian locale

1.27.0

1.26.10

  • fixed:
    • Occitan locale

1.26.9

  • fixed:

1.26.8

  • added:
    • Portuguese (pt_PT)

1.26.7

  • fixed:
    • Hungarian locale weekdays order

1.26.6

  • added:
    • allow initialising Moment with unix timestamp without leading @

1.26.5

  • fixed:
    • Fix format of 'LLL' in Custom Formats

1.26.4

  • fixed:
    • removed php5.4+ only syntax

1.26.3

  • fixed:
    • Danish day- and monthnames correct case
    • French locale
    • PHPDocs
  • added:
    • consts for NO_TZ_MYSQL, NO_TZ_NO_SECS and NO_TIME when parsing dates

1.26.2

  • added:
    • Dutch customFormat

1.26.1

  • fixed:
    • Russian locale

1.26.0

  • added:
    • Turkish locale
  • fixed:
    • Lengadocian locale

1.25.1

  • fixed:
    • PHP7.1 setTime requires $microseconds

1.25

  • added:
    • Ukrainian locale

1.24

  • added:
    • Hungarian locale

1.23.1

  • fixed:
    • Lengadocian locale

1.23.0

  • added:
    • Vietnamese locale
    • Lengadocian locale

1.22.0

  • added:
    • Change default timezone
  • fixed:
    • FormatsInterface docs

1.21.0

  • added:
    • Arabic locale
    • Custom format on locale level

1.20.9

  • fixed:
    • Russian locale
  • added:
    • Russian locale tests

1.20.8

  • fixed:
    • Polish locale
    • Calculation of seconds

1.20.7

  • fixed:
    • Russian: more relative time fixes

1.20.6

  • fixed:
    • Russian locale relative time: day handling

1.20.5

  • fixed:
    • missing immutable handling

1.20.4

  • fixed:
    • Improved Polish locale (added Nominativ)

1.20.3

  • fixed:
    • Chinese locale

1.20.2

  • added accepted formats to README

1.20.1

  • fixed:
    • Thai locale

1.20.0

  • added:
    • Catalan locale
  • fixed:
    • Polish locale test

1.19.0

  • added:
    • Russian locale
  • fixed:
    • Polish locale test

1.18.0

  • added:
    • Immutable mode
  • fixed:
    • Polish locale

1.17.0

  • added:
    • Polish locale

1.16.0

  • added:
    • Indonesian locale

1.15.0

  • added:
    • Japanese locale

1.14.1

  • fixed:
    • typo in Dutch locale

1.14.0

  • added:
    • Dutch locale

1.13.0

  • added:
    • Swedish locale

1.12.0

  • added:
    • Danish locale

1.11.4

  • fixed:
    • fixed starting/ending weekday for Romanian locale

1.11.3

  • fixed:
    • adding delimiter character to Italian locale

1.11.1

  • fixed:
    • passing back new instance for startOf/endOf for week, month, quarter

1.11.0

  • added:
    • locale Czech

1.10.4

  • added:
    • calendar locale receives as \Closure the following params function(Moment $m) {}
    • relativeTime locale receives as \Closure the following params function($count, $direction, Moment $m) {}

1.10.3

  • added:
    • fixed passing closures to locale (calendar, relativeTime)
    • set correct german locale information

1.10.2

  • added:
    • fixed Thai locale strings

1.10.1

  • added:
    • locale traditional Chinese

1.10.0

  • added:
    • locale Chinese
    • ordinal formatter receives now the token e.g. the token within dS is d

1.9.1

  • fixed: english ordinal issue for numbers between 11 - 13

1.9.0

  • added: locale Italian

1.8.1

  • fixed: english ordinal issue

1.8.0

  • added: locale Portuguese

1.7.2

  • fixed:
    • Locale displayed wrong month name (#34)
    • Changed the order of weekdays within locale files

1.7.1

  • added:
    • getWeekdayNameLong()
    • getWeekdayNameShort()
    • getMonthNameLong()
    • getMonthNameShort()

1.7.0

  • added:
    • Locale: Thai

1.6.0

  • added:
    • Locale
    • MomentFromVo:
      • getMonths()
      • getYears()
      • getRelative()
  • fixed:
    • MomentFromVo:
      • getSeconds() shows now direction as well

1.5.3

  • fixed:
    • timezone issue which occured only for unixtime dates
  • other:
    • MomentFromVo:
      • direction returns now: "future" (-) / "past" (+)
      • time values are now type casted as floats

1.5.2

  • fixed:
    • unrecognised timezone when constructing a Moment

1.5.1

  • added:
    • getMomentsByWeekdays()
    • getWeekday()
    • getWeekOfYear()
  • other:
    • escaped text

1.5.0

  • added:

    • startOf and endOf as implemented by moment.js
    • get the quarter period of a given date
    • setDay()
    • getDay()
    • setMonth()
    • getMonth()
    • setYear()
    • getYear()
    • getQuarter()
    • setSecond()
    • getSecond()
    • setMinute()
    • getMinute()
    • setHour()
    • getHour()
    • added cloning()
      • create a new mutable moment based of the given instance
    • added getInterval() to MomentPeriodVo to indicate the interval of the given period
      • week = week of the year
      • month = month of the year
      • quarter = quarter of the year
    • added a static class MomentHelper
      • get the period for a given quarter in a given year
    • fixed PHP's internal ordinal calculation (also in combination with moment.js formatting)
      • e.g. WS for 21th week of the year shows now correct 21th etc.
    • you can now escape text by wrapping it in []
      • e.g. [Hello World] will be automatically transformed into \H\e\l\l\o \W\o\r\l\d
  • removed:

    • add()
    • subtract()

1.4.0

  • added:
    • calendar format as implemented by moment.js

1.3.0

  • fixed:

    • incompatibility w/ PHP 5.3
  • added:

    • Exception throw as MomentException
    • Date validation on instantiation:
      • test for dates w/ format YYYY-mm-dd and YYYY-mm-ddTHH:ii:ss
      • throws MomentException on invalid dates
    • addSeconds()
    • addMinutes()
    • addHours()
    • addDays()
    • addWeeks()
    • addMonths()
    • addYears()
    • subtractSeconds()
    • subtractMinutes()
    • subtractHours()
    • subtractDays()
    • subtractWeeks()
    • subtractMonths()
    • subtractYears()
  • deprecated:

    • add()
    • subtract()

License

Moment.php is freely distributable under the terms of the MIT license.

Copyright (c) 2017 Tino Ehrich

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Comments
  • 'S' is the ordinal suffix for day-of-the-month only.

    'S' is the ordinal suffix for day-of-the-month only.

    In MomentJs.php you have listed conversions for the following momentJS format strings to their appropriate php format strings:

    | Moment.js | PHP | Example (2014-01-02) | | --- | --- | --- | | Mo | nS | 1nd ✖ | | Do | jS | 2nd ✓ | | DDDo | zS | 1nd ✖ | | do | wS | 4nd ✖ | | wo | WS | 1nd ✖ | | Wo | WS | 1nd ✖ |

    The only one of the above conversions that is correct is the 'Do' -> 'jS' conversion. According to the PHP docs, 'S' is the English ordinal suffix for the day of the month only.

    Sources: http://php.net/manual/en/function.date.php

    feature 
    opened by docksteaderluke 14
  • initial Czech locales

    initial Czech locales

    hi, I tried to handle the different grammatical cases Czech language needs for relative future and past times by assigning a function ['relativeTime'][various_keys] but the args I got are not much helpful - so I opted for word forms that should be suitable for the past variant (which seems more used to me)

    opened by ptica 12
  • Add support for ru_RU

    Add support for ru_RU

    I want to use this bundle for my project, but I need support for Russian.

    I am currently investigating adding support for that locale.

    Is anyone else interested in helping?

    feature 
    opened by fabienwarniez 11
  • Wrong name of the month

    Wrong name of the month

    Hi @fightbulc,

    I have following string:

    $message['createdate'] = "2015-06-14 20:46:22"; // from MySQL
    $messages[$key]['date'] = (new \Moment\Moment($message['createdate'], 'Europe/Berlin'))->format('d. F');
    
    // Should return 14. Juni
    

    Should return "14. Juni", but it return "14. Juli".

    I'll update to the newest version now, but I guess the bug is somewhere else.

    opened by hirbod 11
  • Fatal error Locale string does not exist for key: months > 12

    Fatal error Locale string does not exist for key: months > 12

    Hi @fightbulc

    I did nothing - it just looks like moment.php does not like January.

    Fatal error: Uncaught exception 'Moment\MomentException' with message 'Locale string does not exist for key: months > 12' in .../vendor/fightbulc/moment/src/MomentLocale.php:77 
    
    Stack trace: 
    #0 .../vendor/fightbulc/moment/src/MomentLocale.php(95): Moment\MomentLocale::getLocaleString(Array) 
    
    #1 .../vendor/vendor/fightbulc/moment/src/MomentLocale.php(155): Moment\MomentLocale::renderLocaleString(Array) 
    
    #2 .../vendor/fightbulc/moment/src/Moment.php(149): Moment\MomentLocale::renderSpecialLocaleTags('03. 12__0001') 
    
    #3 .../class.Chat.inc.php(668): Moment\Moment->format('d. F') 
    
    #4 .../vendor/fightbulc/moment/src/MomentLocale.php on line 77
    
    investigate 
    opened by hirbod 10
  • Foreign language / andere Sprache

    Foreign language / andere Sprache

    Hey,

    could you tell me how I could force to get the names (month, day, etc) in german? setlocale seems not to work.

    Hi, kannst du mir verraten wie ich die Wochentage etc in deutsch bekomme? Auch würde ich lieber "gestern, heute, morgen" etc im calender() ausgeben lassen, aktuell kommt alles englisch...

    Danke!

    opened by hirbod 6
  • getRelative time is broken in many cases

    getRelative time is broken in many cases

    1. Most of the locales are missing the 'ss' relativeTime definition and the if/then/else logic misses many edge cases. In fact this logic doesn't closely follow the Time from now definitions in moment.js. In addition low numbers of seconds were reported as negative eg. 'in -7 seconds'

    I've now fixed these in my fork and added to the unit tests. @fightbulc - if you don't agree with this logic please comment

    1. However, this broken logic has also uncovered some failed units tests for Latvian and Russian localisations. I don't speak these languages but I could have a go with Google Translate. But I think my pull request would need some expert review perhaps by @LinMAD and @dypa who made most recent contributions to those locales. @fightbulc - please advise.

    I'm ready to submit a pull request for above

    opened by blacknell 5
  • Please provide own autoloader

    Please provide own autoloader

    Hi @fightbulc,

    thanks for this awesome port! Could you please also provide an own AutoLoader instead of relying only to composer? There are sometimes needs to run without. Most of the developers will also ship an own fallback autoload.php in there folders. This would help a lot!

    Thank you.

    feature 
    opened by hirbod 4
  • Added support for setTimeZone grabbed from ISO8601 format

    Added support for setTimeZone grabbed from ISO8601 format

    When a iso8601 format time with timezone is give 2013-12-31T12:30:00+0600 then make it automatically set the timezone to +0600.

    Prevents format errors in startOf and endOf week examples like below

    $iso8601 = '2014-11-02T05:12:15+05:30';
    
    $moment = new \Moment\Moment($iso8601);
    echo $moment->startOf('week')->format('d M').' - '.$moment->endOf('week')->format('d M');
    

    The below example outputs 26 Oct - 01 Nov but the correct result should be 27 Oct - 02 Nov

    This pull request fixes the issues.

    investigate 
    opened by pushpak 4
  • MomentJS style formatting + fixed up examples

    MomentJS style formatting + fixed up examples

    I have added MomentJS to PHP function, which basically identifies the MomentJS formats and converts that into the PHP recognizable format and added a php unit test for that.

    Also updated the examples in readme.

    I had to update the composer in order to publish the repo in packagist, but once you pull the changes. I will change my dependencies.

    Thank you.

    opened by ashishtilara 4
  • Composer issue

    Composer issue

    Getting following error message:

    Your requirements could not be resolved to an installable set of packages.
    
      Problem 1
        - The requested package vendorr/moment.php could not be found in any version, there may be a typo in the package name.
    
    Potential causes:
     - A typo in the package name
     - The package is not available in a stable-enough version according to your minimum-stability setting
       see <https://groups.google.com/d/topic/composer-dev/_g3ASeIFlrc/discussion> for more details.
    

    Any ideas how to fix it?

    opened by ashishtilara 4
  • createFromFormat not compatible - PHP 8

    createFromFormat not compatible - PHP 8

    Hi,

    i use PHP 8.1 and get this message: Return type of Moment\Moment::createFromFormat($format, $time, $timezone = null, ?Moment\FormatsInterface $formatsInterface = null) should either be compatible with DateTime::createFromFormat(string $format, string $datetime, ?DateTimeZone $timezone = null)

    opened by axelf 1
  • ADD recognize weeks

    ADD recognize weeks

    examples:

      week nr 23
      wk 23
      week №23
      week # 23
      W23
      2022#23
      first day 9 AM of 2022#23
      week number 23
      first day 9 AM of 2022 week number 23
      2022 week 23 first day 9 AM
      2022 week nr 23
      2022W23 // ISO format
    
    opened by allanlaal 0
  • fetchSimilarLocales: All-lowercase Accept-Language header doesn't work

    fetchSimilarLocales: All-lowercase Accept-Language header doesn't work

    opened by cachius 0
  • PHP Deprecated

    PHP Deprecated

    [21-Jan-2022 18:09:08 UTC] PHP Deprecated: Return type of Moment\Moment::setTime($hour, $minute, $second = null, $microseconds = null) should either be compatible with DateTime::setTime(int $hour, int $minute, int $second = 0, int $microsecond = 0): DateTime, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/.../vendor/fightbulc/moment/src/Moment.php on line 695

    Trying to use this with PHP 8.0 Getting an error. Has this code been tested on 8.0?

    opened by bradcrump 0
  • fix: PHP 8.1 deprecation warnings

    fix: PHP 8.1 deprecation warnings

    chore: define return type for locale test scripts method setUp(): void chore: migrated PHPUnit configuration using --migrate-configuration fix: suppress deprecation warnings generated in PHP 8.1 with #[\ReturnTypeWillChange] chore: remove unsupported PHP versions fixes #210 #207

    opened by blacknell 3
Releases(1.33.0)
Owner
Tino Ehrich
Tino Ehrich
Display a calendar of commits from public GitHub repositories

commit-calendar Display a list of dates and commits from public GitHub repositories. You will display the list in the terminal, and you can choose to

Erika Gili 5 Jul 23, 2021
A package which provides a monthly calendar with days and events depending on given months and events.

A package which provides a monthly calendar with days and events depending on given months and events. This is where your description should go. Try a

MichaB 6 Nov 1, 2022
CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due

The PHP cron expression parser can parse a CRON expression, determine if it is due to run, calculate the next run date of the expression, and calculate the previous run date of the expression. You can calculate dates far into the future or past by skipping n number of matching dates.

Chris Tankersley 4.3k Jan 9, 2023
This library helps PHP users to convert and using Jalali DateTime format

Easy Jalali for PHP V1.0.0 Jalali calendar converter for Persian users in Iran, Afghanistan and other countries that use Jalali calendar. Very thanks

Majid J 3 Mar 20, 2022
Featured Calendar Maker v1.0 multingual extends the functionalities of the latest version of the FullCalendar (5.3.2), the most popular and completed JavaScript Calendar open source

Featured Calendar Maker v1.0 multingual extends the functionalities of the latest version of the FullCalendar (5.3.2), the most popular and completed JavaScript Calendar open source.

null 21 Oct 5, 2022
A simple PHP API extension for DateTime.

Carbon An international PHP extension for DateTime. http://carbon.nesbot.com <?php use Carbon\Carbon; printf("Right now is %s", Carbon::now()->toDat

Brian Nesbitt 16k Dec 30, 2022
The easy PHP Library for calculating holidays

Introduction Yasumi (Japanese for 'Holiday'「休み」) is the easy PHP library that helps you retrieve the dates and names of holidays and other special cel

AzuyaLabs 926 Dec 29, 2022
The missing PHP 5.3+ calendar management library.

CalendR CalendR is an Object Oriented Calendar management library on top of PHP5.3+ Date objects. You can use it to deal with all your needs about cal

Yohan Giarelli 462 Dec 30, 2022
Date Manager PHP Class

Date Manager PHP Class Date Manager Version 1.0.0 PHP class for date management, for example converting solar date to gregorian date and vice versa. C

Alireza Tolouei 2 Dec 21, 2021
iCal-creator for PHP - This package offers an abstraction layer for creating iCalendars files

This package offers an abstraction layer for creating iCalendars files. By using this PHP package, you can create *.ics files without the knowledge of the underling format. The output itself will follow RFC 5545 as good as possible.

Markus Poerschke 1k Dec 23, 2022
YCOM Impersonate. Login as selected YCOM user 🧙‍♂️in frontend.

YCOM Impersonate Login as selected YCOM user in frontend. Features: Backend users with admin rights or YCOM[] rights, can be automatically logged in v

Friends Of REDAXO 17 Sep 12, 2022
:date: The VObject library for PHP allows you to easily parse and manipulate iCalendar and vCard objects

sabre/vobject The VObject library allows you to easily parse and manipulate iCalendar and vCard objects using PHP. The goal of the VObject library is

sabre.io 532 Dec 25, 2022
A simple PHP library to parse and manipulate URLs

Url is a simple library to ease creating and managing Urls in PHP.

The League of Extraordinary Packages 351 Dec 30, 2022
Parse DSN strings into value objects to make them easier to use, pass around and manipulate

DSN parser Parse DSN strings into value objects to make them easier to use, pass around and manipulate. Install Via Composer composer require nyholm/d

Tobias Nyholm 77 Dec 13, 2022
Provides support for message translation and localization for dates and numbers.

The I18n library provides a I18n service locator that can be used for setting the current locale, building translation bundles and translating messages. Additionally, it provides the Time and Number classes which can be used to output dates, currencies and any numbers in the right format for the specified locale.

CakePHP 26 Oct 22, 2022
Disclaimer: The documentation of this plugin is English at the moment, but I might go for Latin later down the line, just for the fun of it.

Quiritibus Plugin This repository is storing the custom plugin developed for the Quiritibus Latin Magazine website, currently being developed at: http

Alkor András 1 Jan 19, 2022
Parse and validate crontab expressions in PHP

Standard (V7) compliant crontab expression parser/validator with support for time zones; see "man 5 crontab" for possible expressions.

René Pollesch 42 Dec 14, 2022
Newsprint is a simple web application that will fetch the front page of a newspaper and display it on an eink display

Newsprint is a simple web application that will fetch the front page of a newspaper and display it on an eink display. The specific resolutions and sizes have been setup to work with a 32" eInk place & play display from Visionect but can be modified for other screen resolutions.

Greg Raiz 199 Dec 20, 2022
Tiny hands is a Laravel multi-tenant boilerplate with SPA and i18n.

About Tiny Hands Tiny hands is a Laravel multi-tenant boilerplate with SPA and i18n using the following technology stack: Backend Laravel 8.0 API with

Bertrand Kintanar 12 Jun 23, 2022
Generates a vue-i18n compatible include file from your Laravel translations

This is fork of martinlindhe/laravel-vue-i18n-generator to give Laravel 8+ support for this excellent package.

Alefe Souza 1 Nov 11, 2021