Repository: iamkun/dayjs
Pull request #2327 (2023-06-07 12:06:41)

wontfix/fixed uzbek language relative time translation
When using the translation from i18n to Uzbek Latin and Uzbek Cyrillic, I encountered an incorrect translation into it.


Patch:
diff --git a/.editorconfig b/.editorconfig
index 14c1d8c..d4d73cf 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -4,3 +4,4 @@ root = true
 charset = utf-8
 end_of_line = lf
 insert_final_newline = true
+indent_size = 2
diff --git a/README.md b/README.md
index ca0443f..3e514dc 100644
--- a/README.md
+++ b/README.md
@@ -1,8 +1,8 @@
-English | [简体中文](./docs/zh-cn/README.zh-CN.md) | [日本語](./docs/ja/README-ja.md) | [Português Brasileiro](./docs/pt-br/README-pt-br.md) | [한국어](./docs/ko/README-ko.md) | [Español (España)](./docs/es-es/README-es-es.md) | [Русский](./docs/ru/README-ru.md) | [Türkçe](./docs/tr/README-tr.md) | [සිංහල](./docs/si/README-si.md)
+English | [简体中文](./docs/zh-cn/README.zh-CN.md) | [日本語](./docs/ja/README-ja.md) | [Português Brasileiro](./docs/pt-br/README-pt-br.md) | [한국어](./docs/ko/README-ko.md) | [Español (España)](./docs/es-es/README-es-es.md) | [Русский](./docs/ru/README-ru.md) | [Türkçe](./docs/tr/README-tr.md) | [සිංහල](./docs/si/README-si.md) | [עברית](./docs/he/README-he.md)
 
 <p align="center"><a href="https://day.js.org/" target="_blank" rel="noopener noreferrer"><img width="550"
                                                                              src="https://user-images.githubusercontent.com/17680888/39081119-3057bbe2-456e-11e8-862c-646133ad4b43.png"
-                                                                             alt="Day.js"></a></p>
+                                                                             alt="Day.js" /></a></p>
 <p align="center">Fast <b>2kB</b> alternative to Moment.js with the same modern API</p>
 <p align="center">
     <a href="https://unpkg.com/dayjs/dayjs.min.js"><img
@@ -41,7 +41,7 @@ dayjs().startOf('month').add(1, 'day').set('year', 2018).format('YYYY-MM-DD HH:m
 
 ### Documentation
 
-You can find for more details, API, and other docs on [day.js.org](https://day.js.org/) website.
+You can find more details, API, and other docs on [day.js.org](https://day.js.org/) website.
 
 ### Installation
 
@@ -82,6 +82,7 @@ dayjs.locale('es') // use Spanish locale globally
 
 dayjs('2018-05-05').locale('zh-cn').format() // use Chinese Simplified locale in a specific instance
 ```
+
 📚[Internationalization](https://day.js.org/docs/en/i18n/i18n)
 
 ### Plugin
@@ -100,7 +101,7 @@ dayjs().format('Q Do k kk X x') // more available formats
 
 ## Sponsors
 
-Support this project by becoming a sponsor. Your logo will show up here with a link to your website. 
+Support this project by becoming a sponsor. Your logo will show up here with a link to your website.
 
 [[Become a sponsor via Github](https://github.com/sponsors/iamkun/)] [[Become a sponsor via OpenCollective](https://opencollective.com/dayjs#sponsor)]
 
diff --git a/docs/es-es/README-es-es.md b/docs/es-es/README-es-es.md
index ae190e8..cd16857 100644
--- a/docs/es-es/README-es-es.md
+++ b/docs/es-es/README-es-es.md
@@ -1,4 +1,4 @@
-Español (España) | [English](../../README.md) | [简体中文](../zh-cn/README.zh-CN.md) | [日本語](../ja/README-ja.md) | [Português Brasileiro](../pt-br/README-pt-br.md) | [한국어](../ko/README-ko.md) | [Русский](../ru/README-ru.md)
+Español (España) | [English](../../README.md) | [简体中文](../zh-cn/README.zh-CN.md) | [日本語](../ja/README-ja.md) | [Português Brasileiro](../pt-br/README-pt-br.md) | [한국어](../ko/README-ko.md) | [Русский](../ru/README-ru.md) | [עברית](./docs/he/README-he.md) 
 
 <p align="center"><a href="https://day.js.org/" target="_blank" rel="noopener noreferrer"><img width="550"
                                                                              src="https://user-images.githubusercontent.com/17680888/39081119-3057bbe2-456e-11e8-862c-646133ad4b43.png"
diff --git a/docs/he/README-he.md b/docs/he/README-he.md
new file mode 100644
index 0000000..aeb0419
--- /dev/null
+++ b/docs/he/README-he.md
@@ -0,0 +1,171 @@
+<div dir="rtl">
+
+עברית | [English](../../README.md)  | [简体中文](./docs/zh-cn/README.zh-CN.md) | [日本語](./docs/ja/README-ja.md) | [Português Brasileiro](./docs/pt-br/README-pt-br.md) | [한국어](./docs/ko/README-ko.md) | [Español (España)](./docs/es-es/README-es-es.md) | [Русский](./docs/ru/README-ru.md) | [Türkçe](./docs/tr/README-tr.md) | [සිංහල](./docs/si/README-si.md)
+
+<p align="center"><a href="https://day.js.org/" target="_blank" rel="noopener noreferrer"><img width="550"
+                                                                             src="https://user-images.githubusercontent.com/17680888/39081119-3057bbe2-456e-11e8-862c-646133ad4b43.png"
+                                                                             alt="Day.js"></a></p>
+<p align="center">אלטרנטיבה מהירה ל-Moment.js ששוקלת רק <b>2kB</b> עם אותן יכולות מודרניות</p>
+<p align="center">
+    <a href="https://unpkg.com/dayjs/dayjs.min.js"><img
+            src="https://img.badgesize.io/https://unpkg.com/dayjs/dayjs.min.js?compression=gzip&style=flat-square"
+            alt="Gzip Size"></a>
+    <a href="https://www.npmjs.com/package/dayjs"><img src="https://img.shields.io/npm/v/dayjs.svg?style=flat-square&colorB=51C838"
+                                                       alt="NPM Version"></a>
+    <a href="https://travis-ci.com/iamkun/dayjs"><img
+            src="https://img.shields.io/travis/iamkun/dayjs/master.svg?style=flat-square" alt="Build Status"></a>
+    <a href="https://codecov.io/gh/iamkun/dayjs"><img
+            src="https://img.shields.io/codecov/c/github/iamkun/dayjs/master.svg?style=flat-square" alt="Codecov"></a>
+    <a href="https://github.com/iamkun/dayjs/blob/master/LICENSE"><img
+            src="https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square" alt="License"></a>
+    <br>
+    <a href="https://saucelabs.com/u/dayjs">
+        <img width="750" src="https://user-images.githubusercontent.com/17680888/40040137-8e3323a6-584b-11e8-9dba-bbe577ee8a7b.png" alt="Sauce Test Status">
+    </a>
+</p>
+
+> Day.js היא ספרייה מינימלסטית לפענוח, אימות, מניפולציה והצגה של תאריכים ושעות לדפדפנים מודרנים עם תאימות גבוהה ל-API של Moment.js. אם השתמשתם ב-Moment.js, אתם כבר יודעים את Day.js 
+
+<div dir="ltr">
+
+```js
+dayjs().startOf('month').add(1, 'day').set('year', 2018).format('YYYY-MM-DD HH:mm:ss');
+```
+
+</div>
+
+* 🕒 תבניות ו-API זהים ל-Moment.js
+* 💪 אינו ניתן לשינוי
+* 🔥 ניתן לשרשור
+* 🌐 תמיכה ב-I18n
+* 📦 ספרייה קטנטנה 2kb
+* 👫 נתמכת בכל הדפדפנים
+
+---
+
+## צעדים ראשונים 
+
+### דוקומנטצייה 
+באתר [day.js.org](https://day.js.org/) ניתן למצוא פרטים נוספים, API, ותיעודים נוספים.
+
+
+### התקנה 
+
+```console
+npm install dayjs --save
+```
+
+📚[מדריך התקנה](https://day.js.org/docs/en/installation/installation)
+
+### API
+מאוד קל להשתמש ב-Day.js לפענוח, אימות, מניפולציה והצגה של תאריכים ושעות. 
+
+<div dir="ltr">
+
+
+```javascript
+dayjs('2018-08-08') // פענוח
+
+dayjs().format('{YYYY} MM-DDTHH:mm:ss SSS [Z] A') // הצגה
+
+dayjs().set('month', 3).month() // קבלה והגדרה
+
+dayjs().add(1, 'year') // מניפולציה
+
+dayjs().isBefore(dayjs()) // שאילתה
+```
+
+</div>
+
+📚[תיעודי API](https://day.js.org/docs/en/parse/parse)
+
+### I18n
+ל-Day.js יש תמיכה מצוינית בבינלאומיות.
+
+אבל אף אחד מהם לא יכלל בקובץ הסופי אלא אם כן יתבצע בהם שימוש.
+
+<div dir="ltr">
+
+
+```javascript
+import 'dayjs/locale/es' // טעינה לפי הצורך
+
+dayjs.locale('es') // הגדרה לשימוש בספרדית באופן גלובלאלי
+
+dayjs('2018-05-05').locale('zh-cn').format() // הגדרה לשימוש בסינית פשוטה למופע ספיציפי בלבד
+```
+
+</div>
+
+
+📚[בינלאומיות](https://day.js.org/docs/en/i18n/i18n)
+
+### תוסף
+
+תוסף הוא מודל בלתי-תלוי הניתן להוספה ל-Day.js להרחבה או להוספה של פונקציות.
+
+
+<div dir="ltr">
+
+
+```javascript
+import advancedFormat from 'dayjs/plugin/advancedFormat' //  טעינה לפי הצורך
+
+dayjs.extend(advancedFormat) // שימוש בתוסף
+
+dayjs().format('Q Do k kk X x') // כעת יותר אפשרויות זמינות
+```
+
+</div>
+
+📚[רשימת תוספים](https://day.js.org/docs/en/plugin/plugin)
+
+## ספונסרים 
+תמכו בפרויקט זה כדי להיות ספונסר. קבלו לוגו עם קישור לאתר שלכם שיופיע כאן. 
+
+
+[[תמיכה דרך Github](https://github.com/sponsors/iamkun/)] [[תמיכה דרך OpenCollective](https://opencollective.com/dayjs#sponsor)]
+
+<a href="https://toyokumo.co.jp" target="_blank">
+  <img width="70" src="https://user-images.githubusercontent.com/17680888/197092231-2367b5eb-1e43-467e-a311-23f7cd97b086.png">
+</a>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<a href="https://github.com/alan-eu" target="_blank">
+  <img width="70" src="https://avatars.githubusercontent.com/u/18175329?s=52&v=4">
+</a>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<a href="https://opencollective.com/sight-and-sound-ministries" target="_blank">
+  <img width="70" src="https://user-images.githubusercontent.com/17680888/232316426-cb99b4cf-0ccb-4e73-a6ce-e16dba6aadf4.png">
+</a>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<a href="https://www.exoflare.com/open-source/?utm_source=dayjs&utm_campaign=open_source" target="_blank">
+  <img width="70" src="https://user-images.githubusercontent.com/17680888/162761622-1407a849-0c41-4591-8aa9-f98114ec2092.png">
+</a>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<a href="https://rxdb.info/?utm_source=day.js.org&utm_medium=banner&utm_campaign=day.js.org-sponsored" target="_blank"><img width="70" src="https://user-images.githubusercontent.com/17680888/200301812-9c9bd523-5dc4-4cab-b380-543fbcd3802c.svg"></a>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<a href="https://github.com/vendure-ecommerce" target="_blank"><img width="70" src="https://avatars.githubusercontent.com/u/39629390?s=52&v=4"></a>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<a href="https://opencollective.com/docbot" target="_blank"><img width="70" src="https://images.opencollective.com/docbot/457761e/logo.png"></a>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<a href="https://opencollective.com/datawrapper" target="_blank"><img width="70" src="https://images.opencollective.com/datawrapper/c13e229/logo.png"></a>
+
+## תורמים 
+
+פרויקט זה קיים הודות לכל האנשים שתמכו בו.
+
+תנו לנו 💖 כוכב 💖 כדי לתמוך בנו. תודה רבה.
+
+ותודה רבה לכל התומכים שלנו! 🙏
+
+<a href="https://opencollective.com/dayjs/backer/0/website?requireActive=false" target="_blank"><img width="35" src="https://opencollective.com/dayjs/backer/0/avatar.svg?requireActive=false"></a>
+<a href="https://opencollective.com/dayjs/backer/1/website?requireActive=false" target="_blank"><img width="35" src="https://opencollective.com/dayjs/backer/1/avatar.svg?requireActive=false"></a>
+<a href="https://opencollective.com/dayjs/backer/2/website?requireActive=false" target="_blank"><img width="35" src="https://opencollective.com/dayjs/backer/2/avatar.svg?requireActive=false"></a>
+<a href="https://opencollective.com/dayjs/backer/3/website?requireActive=false" target="_blank"><img width="35" src="https://opencollective.com/dayjs/backer/3/avatar.svg?requireActive=false"></a>
+<br />
+<a href="https://opencollective.com/dayjs#backers" target="_blank"><img src="https://opencollective.com/dayjs/contributors.svg?width=890" /></a>
+
+## רישיון 
+
+Day.js מורשה לשימוש עם [רישיון MIT](./LICENSE).
+</div>
diff --git a/docs/ja/README-ja.md b/docs/ja/README-ja.md
index b40ceeb..32f4663 100644
--- a/docs/ja/README-ja.md
+++ b/docs/ja/README-ja.md
@@ -1,4 +1,4 @@
-日本語 | [English](../../README.md) | [简体中文](../zh-cn/README.zh-CN.md) | [Português Brasileiro](../pt-br/README-pt-br.md) | [한국어](../ko/README-ko.md) | [Español (España)](../es-es/README-es-es.md) | [Русский](../ru/README-ru.md)
+日本語 | [English](../../README.md) | [简体中文](../zh-cn/README.zh-CN.md) | [Português Brasileiro](../pt-br/README-pt-br.md) | [한국어](../ko/README-ko.md) | [Español (España)](../es-es/README-es-es.md) | [Русский](../ru/README-ru.md)| [עברית](../he/README-he.md)
 
 <p align="center"><a href="https://day.js.org/" target="_blank" rel="noopener noreferrer"><img width="550"
                                                                              src="https://user-images.githubusercontent.com/17680888/39081119-3057bbe2-456e-11e8-862c-646133ad4b43.png"
@@ -44,9 +44,9 @@ dayjs()
 
 ## はじめに
 
-### Documentation
+### ドキュメント
 
-You can find for more details, API, and other docs on [day.js.org](https://day.js.org/) website.
+詳細、API、その他のドキュメントについては、[day.js.org](https://day.js.org/) のウェブサイトを参照してください。
 
 ### インストール
 
diff --git a/docs/ko/README-ko.md b/docs/ko/README-ko.md
index 7d6228d..cb1f77a 100644
--- a/docs/ko/README-ko.md
+++ b/docs/ko/README-ko.md
@@ -1,4 +1,4 @@
-한국어 | [English](../../README.md) | [简体中文](../zh-cn/README.zh-CN.md) | [日本語](../ja/README-ja.md) | [Português Brasileiro](../pt-br/README-pt-br.md) | [Español (España)](../es-es/README-es-es.md) | [Русский](../ru/README-ru.md)
+한국어 | [English](../../README.md) | [简体中文](../zh-cn/README.zh-CN.md) | [日本語](../ja/README-ja.md) | [Português Brasileiro](../pt-br/README-pt-br.md) | [Español (España)](../es-es/README-es-es.md) | [Русский](../ru/README-ru.md)| [עברית](./docs/he/README-he.md)
 
 <p align="center"><a href="https://day.js.org/" target="_blank" rel="noopener noreferrer"><img width="550"
                                                                              src="https://user-images.githubusercontent.com/17680888/39081119-3057bbe2-456e-11e8-862c-646133ad4b43.png"
@@ -23,7 +23,7 @@
     </a>
 </p>
 
-> Day.js는 Moment.js와 호환되는 대부분의 API를 사용하며, 최신 브라우저에서 날짜와 시간에 대한 구문 분석, 유효성 검사, 조작, 출력하는 경량 JavaScript 라이브러리입니다. Moment.js를 사용하고 있다면, Day.js는 껌입니다.
+> Day.js는 대부분의 API가 Moment.js와 호환되며 최신 브라우저에서 날짜와 시간에 대한 구문 분석, 유효성 검사, 조작, 출력을 간편하게 처리하는 경량 JavaScript 라이브러리 입니다. Moment.js를 사용해본 경험이 있다면, Day.js도 쉽게 사용하실 수 있습니다.
 
 ```js
 dayjs()
@@ -46,7 +46,7 @@ dayjs()
 
 ### 문서
 
-더 많은 세부 사항과 API, 그리고 다른 문서를 [day.js.org](https://day.js.org/) 웹사이트에서 볼 수 있습니다.
+더 많은 세부 사항과 API 및 다른 문서는 [day.js.org](https://day.js.org/) 웹사이트에서 확인하실 수 있습니다.
 
 ### 설치
 
@@ -58,7 +58,7 @@ npm install dayjs --save
 
 ### API
 
-Day.js API를 사용해서 날짜와 시간에 대한 구문 분석, 유효성 검사, 조작, 출력을 쉽게 할 수 있습니다.
+Day.js API를 사용하여 날짜와 시간의 구문 분석, 검증, 조작, 출력을 간편하게 처리할 수 있습니다.
 
 ```javascript
 dayjs('2018-08-08') // parse
@@ -78,9 +78,9 @@ dayjs().isBefore(dayjs()) // query
 
 ### I18n
 
-Day.js는 국제화에 대해 많은 지원을 합니다.
+Day.js는 국제화에 대한 많은 지원을 제공하고 있습니다.
 
-그러나 그것을 사용하지 않는다면, 그 누구도 당신의 빌드에 포함되지 않습니다.
+하지만 이 기능을 사용하지 않는 경우, 빌드에 포함되지 않습니다.
 
 ```javascript
 import 'dayjs/locale/es' // load on demand
@@ -96,7 +96,7 @@ dayjs('2018-05-05')
 
 ### Plugin
 
-플러그인은 기능을 확장하거나 새로운 기능을 추가하기 위해 Day.js에 추가할 수 있는 독립적인 모듈입니다.
+플러그인은 Day.js의 기능을 확장하거나 새로운 기능을 도입하기 위한 독립적인 모듈입니다.
 
 ```javascript
 import advancedFormat from 'dayjs/plugin/advancedFormat' // load on demand
diff --git a/docs/pt-br/README-pt-br.md b/docs/pt-br/README-pt-br.md
index 4923fa5..f41fb3b 100644
--- a/docs/pt-br/README-pt-br.md
+++ b/docs/pt-br/README-pt-br.md
@@ -1,4 +1,4 @@
-Português Brasileiro | [English](../../README.md) | [简体中文](../zh-cn/README.zh-CN.md) | [日本語](../ja/README-ja.md) | [한국어](../ko/README-ko.md) | [Español (España)](../es-es/README-es-es.md) | [Русский](../ru/README-ru.md)
+Português Brasileiro | [English](../../README.md) | [简体中文](../zh-cn/README.zh-CN.md) | [日本語](../ja/README-ja.md) | [한국어](../ko/README-ko.md) | [Español (España)](../es-es/README-es-es.md) | [Русский](../ru/README-ru.md)| [עברית](./docs/he/README-he.md)
 
 <p align="center"><a href="https://day.js.org/" target="_blank" rel="noopener noreferrer"><img width="550"
                                                                              src="https://user-images.githubusercontent.com/17680888/39081119-3057bbe2-456e-11e8-862c-646133ad4b43.png"
diff --git a/docs/ru/README-ru.md b/docs/ru/README-ru.md
index c8f9b83..1ebb05c 100644
--- a/docs/ru/README-ru.md
+++ b/docs/ru/README-ru.md
@@ -1,4 +1,4 @@
-Русский | [English](../../README.md) | [简体中文](../zh-cn/README.zh-CN.md) | [日本語](../ja/README-ja.md) | [Português Brasileiro](../pt-br/README-pt-br.md) | [한국어](../ko/README-ko.md) | [Español (España)](../es-es/README-es-es.md)
+Русский | [English](../../README.md) | [简体中文](../zh-cn/README.zh-CN.md) | [日本語](../ja/README-ja.md) | [Português Brasileiro](../pt-br/README-pt-br.md) | [한국어](../ko/README-ko.md) | [Español (España)](../es-es/README-es-es.md)| [עברית](./docs/he/README-he.md)
 
 <p align="center"><a href="https://day.js.org/ru/" target="_blank" rel="noopener noreferrer"><img width="550"
                                                                              src="https://user-images.githubusercontent.com/17680888/39081119-3057bbe2-456e-11e8-862c-646133ad4b43.png"
diff --git a/docs/si/README-si.md b/docs/si/README-si.md
index 3737b76..37f6f20 100644
--- a/docs/si/README-si.md
+++ b/docs/si/README-si.md
@@ -1,4 +1,4 @@
-සිංහල | [English](../../README.md) | [简体中文](./docs/zh-cn/README.zh-CN.md) | [日本語](./docs/ja/README-ja.md) | [Português Brasileiro](./docs/pt-br/README-pt-br.md) | [한국어](./docs/ko/README-ko.md) | [Español (España)](./docs/es-es/README-es-es.md) | [Русский](./docs/ru/README-ru.md) | [Türkçe](./docs/tr/README-tr.md)
+සිංහල | [English](../../README.md) | [简体中文](./docs/zh-cn/README.zh-CN.md) | [日本語](./docs/ja/README-ja.md) | [Português Brasileiro](./docs/pt-br/README-pt-br.md) | [한국어](./docs/ko/README-ko.md) | [Español (España)](./docs/es-es/README-es-es.md) | [Русский](./docs/ru/README-ru.md) | [Türkçe](./docs/tr/README-tr.md)| [עברית](./docs/he/README-he.md)
 
 <p align="center"><a href="https://day.js.org/" target="_blank" rel="noopener noreferrer"><img width="550"
                                                                              src="https://user-images.githubusercontent.com/17680888/39081119-3057bbe2-456e-11e8-862c-646133ad4b43.png"
diff --git a/docs/tr/README-tr.md b/docs/tr/README-tr.md
index c5d8840..ebf4dcf 100644
--- a/docs/tr/README-tr.md
+++ b/docs/tr/README-tr.md
@@ -1,4 +1,4 @@
-Türkçe | [English](../../README.md) | [简体中文](../zh-cn/README.zh-CN.md) | [日本語](../ja/README-ja.md) | [Português Brasileiro](../pt-br/README-pt-br.md) | [한국어](../ko/README-ko.md) | [Español (España)](../es-es/README-es-es.md) | [Русский](../ru/README-ru.md)
+Türkçe | [English](../../README.md) | [简体中文](../zh-cn/README.zh-CN.md) | [日本語](../ja/README-ja.md) | [Português Brasileiro](../pt-br/README-pt-br.md) | [한국어](../ko/README-ko.md) | [Español (España)](../es-es/README-es-es.md) | [Русский](../ru/README-ru.md)| [עברית](./docs/he/README-he.md)
 
 <p align="center"><a href="https://day.js.org/" target="_blank" rel="noopener noreferrer"><img width="550"
                                                                              src="https://user-images.githubusercontent.com/17680888/39081119-3057bbe2-456e-11e8-862c-646133ad4b43.png"
@@ -133,4 +133,4 @@ Ve tüm destekçilerimize teşekkür ederiz! 🙏
 
 ## Lisans
 
-Day.js, bir [MIT Lisansı](../../LICENSE) altında lisanslanmıştır.
\ No newline at end of file
+Day.js, bir [MIT Lisansı](../../LICENSE) altında lisanslanmıştır.
diff --git a/src/index.js b/src/index.js
index ba74b8b..d26a401 100644
--- a/src/index.js
+++ b/src/index.js
@@ -6,7 +6,10 @@ let L = 'en' // global locale
 const Ls = {} // global loaded locale
 Ls[L] = en
 
-const isDayjs = d => d instanceof Dayjs // eslint-disable-line no-use-before-define
+const IS_DAYJS = '$isDayjsObject'
+
+// eslint-disable-next-line no-use-before-define
+const isDayjs = d => d instanceof Dayjs || !!(d && d[IS_DAYJS])
 
 const parseLocale = (preset, object, isLocal) => {
   let l
@@ -72,7 +75,7 @@ const parseDate = (cfg) => {
           || 1, d[4] || 0, d[5] || 0, d[6] || 0, ms))
       }
       return new Date(d[1], m, d[3]
-          || 1, d[4] || 0, d[5] || 0, d[6] || 0, ms)
+        || 1, d[4] || 0, d[5] || 0, d[6] || 0, ms)
     }
   }
 
@@ -83,6 +86,7 @@ class Dayjs {
   constructor(cfg) {
     this.$L = parseLocale(cfg.locale, null, true)
     this.parse(cfg) // for plugin
+    this[IS_DAYJS] = true
   }
 
   parse(cfg) {
@@ -278,34 +282,63 @@ class Dayjs {
       return isLowercase ? m.toLowerCase() : m
     })
 
-    const matches = {
-      YY: String(this.$y).slice(-2),
-      YYYY: Utils.s(this.$y, 4, '0'),
-      M: $M + 1,
-      MM: Utils.s($M + 1, 2, '0'),
-      MMM: getShort(locale.monthsShort, $M, months, 3),
-      MMMM: getShort(months, $M),
-      D: this.$D,
-      DD: Utils.s(this.$D, 2, '0'),
-      d: String(this.$W),
-      dd: getShort(locale.weekdaysMin, this.$W, weekdays, 2),
-      ddd: getShort(locale.weekdaysShort, this.$W, weekdays, 3),
-      dddd: weekdays[this.$W],
-      H: String($H),
-      HH: Utils.s($H, 2, '0'),
-      h: get$H(1),
-      hh: get$H(2),
-      a: meridiemFunc($H, $m, true),
-      A: meridiemFunc($H, $m, false),
-      m: String($m),
-      mm: Utils.s($m, 2, '0'),
-      s: String(this.$s),
-      ss: Utils.s(this.$s, 2, '0'),
-      SSS: Utils.s(this.$ms, 3, '0'),
-      Z: zoneStr // 'ZZ' logic below
+    const matches = (match) => {
+      switch (match) {
+        case 'YY':
+          return String(this.$y).slice(-2)
+        case 'YYYY':
+          return Utils.s(this.$y, 4, '0')
+        case 'M':
+          return $M + 1
+        case 'MM':
+          return Utils.s($M + 1, 2, '0')
+        case 'MMM':
+          return getShort(locale.monthsShort, $M, months, 3)
+        case 'MMMM':
+          return getShort(months, $M)
+        case 'D':
+          return this.$D
+        case 'DD':
+          return Utils.s(this.$D, 2, '0')
+        case 'd':
+          return String(this.$W)
+        case 'dd':
+          return getShort(locale.weekdaysMin, this.$W, weekdays, 2)
+        case 'ddd':
+          return getShort(locale.weekdaysShort, this.$W, weekdays, 3)
+        case 'dddd':
+          return weekdays[this.$W]
+        case 'H':
+          return String($H)
+        case 'HH':
+          return Utils.s($H, 2, '0')
+        case 'h':
+          return get$H(1)
+        case 'hh':
+          return get$H(2)
+        case 'a':
+          return meridiemFunc($H, $m, true)
+        case 'A':
+          return meridiemFunc($H, $m, false)
+        case 'm':
+          return String($m)
+        case 'mm':
+          return Utils.s($m, 2, '0')
+        case 's':
+          return String(this.$s)
+        case 'ss':
+          return Utils.s(this.$s, 2, '0')
+        case 'SSS':
+          return Utils.s(this.$ms, 3, '0')
+        case 'Z':
+          return zoneStr // 'ZZ' logic below
+        default:
+          break
+      }
+      return null
     }
 
-    return str.replace(C.REGEX_FORMAT, (match, $1) => $1 || matches[match] || zoneStr.replace(':', '')) // 'ZZ'
+    return str.replace(C.REGEX_FORMAT, (match, $1) => $1 || matches(match) || zoneStr.replace(':', '')) // 'ZZ'
   }
 
   utcOffset() {
@@ -319,18 +352,38 @@ class Dayjs {
     const that = dayjs(input)
     const zoneDelta = (that.utcOffset() - this.utcOffset()) * C.MILLISECONDS_A_MINUTE
     const diff = this - that
-    let result = Utils.m(this, that)
-
-    result = {
-      [C.Y]: result / 12,
-      [C.M]: result,
-      [C.Q]: result / 3,
-      [C.W]: (diff - zoneDelta) / C.MILLISECONDS_A_WEEK,
-      [C.D]: (diff - zoneDelta) / C.MILLISECONDS_A_DAY,
-      [C.H]: diff / C.MILLISECONDS_A_HOUR,
-      [C.MIN]: diff / C.MILLISECONDS_A_MINUTE,
-      [C.S]: diff / C.MILLISECONDS_A_SECOND
-    }[unit] || diff // milliseconds
+    const getMonth = () => Utils.m(this, that)
+
+    let result
+    switch (unit) {
+      case C.Y:
+        result = getMonth() / 12
+        break
+      case C.M:
+        result = getMonth()
+        break
+      case C.Q:
+        result = getMonth() / 3
+        break
+      case C.W:
+        result = (diff - zoneDelta) / C.MILLISECONDS_A_WEEK
+        break
+      case C.D:
+        result = (diff - zoneDelta) / C.MILLISECONDS_A_DAY
+        break
+      case C.H:
+        result = diff / C.MILLISECONDS_A_HOUR
+        break
+      case C.MIN:
+        result = diff / C.MILLISECONDS_A_MINUTE
+        break
+      case C.S:
+        result = diff / C.MILLISECONDS_A_SECOND
+        break
+      default:
+        result = diff // milliseconds
+        break
+    }
 
     return float ? result : Utils.a(result)
   }
diff --git a/src/locale/ar.js b/src/locale/ar.js
index a7025c4..f418379 100644
--- a/src/locale/ar.js
+++ b/src/locale/ar.js
@@ -2,6 +2,7 @@
 import dayjs from 'dayjs'
 
 const months = 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_')
+
 const symbolMap = {
   1: '١',
   2: '٢',
@@ -36,6 +37,7 @@ const locale = {
   months,
   monthsShort: months,
   weekStart: 6,
+  meridiem: hour => (hour > 12 ? 'م' : 'ص'),
   relativeTime: {
     future: 'بعد %s',
     past: 'منذ %s',
diff --git a/src/locale/fa.js b/src/locale/fa.js
index cbcd13c..cf33827 100644
--- a/src/locale/fa.js
+++ b/src/locale/fa.js
@@ -4,11 +4,11 @@ import dayjs from 'dayjs'
 const locale = {
   name: 'fa',
   weekdays: 'یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه'.split('_'),
-  weekdaysShort: 'یک‌_دو_سه‌_چه_پن_جم_شن'.split('_'),
+  weekdaysShort: 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'),
   weekdaysMin: 'ی_د_س_چ_پ_ج_ش'.split('_'),
   weekStart: 6,
-  months: 'فروردین_اردیبهشت_خرداد_تیر_مرداد_شهریور_مهر_آبان_آذر_دی_بهمن_اسفند'.split('_'),
-  monthsShort: 'فرو_ارد_خرد_تیر_مرد_شهر_مهر_آبا_آذر_دی_بهم_اسف'.split('_'),
+  months: 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),
+  monthsShort: 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),
   ordinal: n => n,
   formats: {
     LT: 'HH:mm',
@@ -20,7 +20,7 @@ const locale = {
   },
   relativeTime: {
     future: 'در %s',
-    past: '%s قبل',
+    past: '%s پیش',
     s: 'چند ثانیه',
     m: 'یک دقیقه',
     mm: '%d دقیقه',
diff --git a/src/locale/ko.js b/src/locale/ko.js
index 8a8e8ea..7053e83 100644
--- a/src/locale/ko.js
+++ b/src/locale/ko.js
@@ -8,7 +8,7 @@ const locale = {
   weekdaysMin: '일_월_화_수_목_금_토'.split('_'),
   months: '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'),
   monthsShort: '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'),
-  ordinal: n => n,
+  ordinal: n => `${n}일`,
   formats: {
     LT: 'A h:mm',
     LTS: 'A h:mm:ss',
diff --git a/src/locale/sl.js b/src/locale/sl.js
index f09e3bf..1e0e4f8 100644
--- a/src/locale/sl.js
+++ b/src/locale/sl.js
@@ -1,6 +1,71 @@
 // Slovenian [sl]
 import dayjs from 'dayjs'
 
+function dual(n) {
+  return (n % 100) == 2 // eslint-disable-line
+}
+
+function threeFour(n) {
+  return (n % 100) == 3 || (n % 100) == 4 // eslint-disable-line
+}
+
+/* eslint-disable */
+function translate(number, withoutSuffix, key, isFuture) {
+  const result = `${number} `
+  switch (key) {
+    case 's': // a few seconds / in a few seconds / a few seconds ago
+      return (withoutSuffix || isFuture) ? 'nekaj sekund' : 'nekaj sekundami'
+    case 'm': // a minute / in a minute / a minute ago
+      return withoutSuffix ? 'ena minuta' : 'eno minuto'
+    case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
+      if (dual(number)) {
+        return result + ((withoutSuffix || isFuture) ? 'minuti' : 'minutama')
+      }
+      if (threeFour(number)) {
+        return result + ((withoutSuffix || isFuture) ? 'minute' : 'minutami')
+      }
+      return result + ((withoutSuffix || isFuture) ? 'minut' : 'minutami')
+    case 'h': // an hour / in an hour / an hour ago
+      return withoutSuffix ? 'ena ura' : (isFuture ? 'eno uro' : 'eno uro')
+    case 'hh': // 9 hours / in 9 hours / 9 hours ago
+      if (dual(number)) {
+        return result + ((withoutSuffix || isFuture) ? 'uri' : 'urama')
+      }
+      if (threeFour(number)) {
+        return result + ((withoutSuffix || isFuture) ? 'ure' : 'urami')
+      }
+      return result + ((withoutSuffix || isFuture) ? 'ur' : 'urami')
+    case 'd': // a day / in a day / a day ago
+      return (withoutSuffix || isFuture) ? 'en dan' : 'enim dnem'
+    case 'dd': // 9 days / in 9 days / 9 days ago
+      if (dual(number)) {
+        return result + ((withoutSuffix || isFuture) ? 'dneva' : 'dnevoma')
+      }
+      return result + ((withoutSuffix || isFuture) ? 'dni' : 'dnevi')
+    case 'M': // a month / in a month / a month ago
+      return (withoutSuffix || isFuture) ? 'en mesec' : 'enim mesecem'
+    case 'MM': // 9 months / in 9 months / 9 months ago
+      if (dual(number)) { // 2 minutes / in 2 minutes
+        return result + ((withoutSuffix || isFuture) ? 'meseca' : 'mesecema')
+      }
+      if (threeFour(number)) {
+        return result + ((withoutSuffix || isFuture) ? 'mesece' : 'meseci')
+      }
+      return result + ((withoutSuffix || isFuture) ? 'mesecev' : 'meseci')
+    case 'y': // a year / in a year / a year ago
+      return (withoutSuffix || isFuture) ? 'eno leto' : 'enim letom'
+    case 'yy': // 9 years / in 9 years / 9 years ago
+      if (dual(number)) { // 2 minutes / in 2 minutes
+        return result + ((withoutSuffix || isFuture) ? 'leti' : 'letoma')
+      }
+      if (threeFour(number)) {
+        return result + ((withoutSuffix || isFuture) ? 'leta' : 'leti')
+      }
+      return result + ((withoutSuffix || isFuture) ? 'let' : 'leti')
+  }
+}
+
+/* eslint-enable */
 const locale = {
   name: 'sl',
   weekdays: 'nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota'.split('_'),
@@ -16,26 +81,26 @@ const locale = {
     L: 'DD.MM.YYYY',
     LL: 'D. MMMM YYYY',
     LLL: 'D. MMMM YYYY H:mm',
-    LLLL: 'dddd, D. MMMM YYYY H:mm'
+    LLLL: 'dddd, D. MMMM YYYY H:mm',
+    l: 'D. M. YYYY'
   },
   relativeTime: {
     future: 'čez %s',
     past: 'pred %s',
-    s: 'nekaj sekund',
-    m: 'minuta',
-    mm: '%d minut',
-    h: 'ura',
-    hh: '%d ur',
-    d: 'dan',
-    dd: '%d dni',
-    M: 'mesec',
-    MM: '%d mesecev',
-    y: 'leto',
-    yy: '%d let'
+    s: translate,
+    m: translate,
+    mm: translate,
+    h: translate,
+    hh: translate,
+    d: translate,
+    dd: translate,
+    M: translate,
+    MM: translate,
+    y: translate,
+    yy: translate
   }
 }
 
 dayjs.locale(locale, null, true)
 
 export default locale
-
diff --git a/src/locale/uz-latn.js b/src/locale/uz-latn.js
index 220d5d4..7d60219 100644
--- a/src/locale/uz-latn.js
+++ b/src/locale/uz-latn.js
@@ -20,7 +20,7 @@ const locale = {
   },
   relativeTime: {
     future: 'Yaqin %s ichida',
-    past: 'Bir necha %s oldin',
+    past: '%s oldin',
     s: 'soniya',
     m: 'bir daqiqa',
     mm: '%d daqiqa',
diff --git a/src/locale/uz.js b/src/locale/uz.js
index 23f4042..e705f68 100644
--- a/src/locale/uz.js
+++ b/src/locale/uz.js
@@ -20,7 +20,7 @@ const locale = {
   },
   relativeTime: {
     future: 'Якин %s ичида',
-    past: 'Бир неча %s олдин',
+    past: '%s олдин',
     s: 'фурсат',
     m: 'бир дакика',
     mm: '%d дакика',
diff --git a/src/plugin/duration/index.js b/src/plugin/duration/index.js
index 5d4cc6a..e2060c3 100644
--- a/src/plugin/duration/index.js
+++ b/src/plugin/duration/index.js
@@ -8,7 +8,7 @@ import {
 } from '../../constant'
 
 const MILLISECONDS_A_YEAR = MILLISECONDS_A_DAY * 365
-const MILLISECONDS_A_MONTH = MILLISECONDS_A_DAY * 30
+const MILLISECONDS_A_MONTH = MILLISECONDS_A_YEAR / 12
 
 const durationRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/
 
@@ -140,6 +140,7 @@ class Duration {
     let seconds = this.$d.seconds || 0
     if (this.$d.milliseconds) {
       seconds += this.$d.milliseconds / 1000
+      seconds = Math.round(seconds * 1000) / 1000
     }
 
     const S = getNumberUnitFormat(seconds, 'S')
@@ -198,7 +199,7 @@ class Duration {
     } else {
       base = this.$d[pUnit]
     }
-    return base === 0 ? 0 : base // a === 0 will be true on both 0 and -0
+    return base || 0 // a === 0 will be true on both 0 and -0
   }
 
   add(input, unit, isSubtract) {
@@ -257,6 +258,15 @@ class Duration {
   asYears() { return this.as('years') }
 }
 
+const manipulateDuration = (date, duration, k) =>
+  date.add(duration.years() * k, 'y')
+    .add(duration.months() * k, 'M')
+    .add(duration.days() * k, 'd')
+    .add(duration.hours() * k, 'h')
+    .add(duration.minutes() * k, 'm')
+    .add(duration.seconds() * k, 's')
+    .add(duration.milliseconds() * k, 'ms')
+
 export default (option, Dayjs, dayjs) => {
   $d = dayjs
   $u = dayjs().$utils()
@@ -268,12 +278,20 @@ export default (option, Dayjs, dayjs) => {
 
   const oldAdd = Dayjs.prototype.add
   const oldSubtract = Dayjs.prototype.subtract
+
   Dayjs.prototype.add = function (value, unit) {
-    if (isDuration(value)) value = value.asMilliseconds()
+    if (isDuration(value)) {
+      return manipulateDuration(this, value, 1)
+    }
+
     return oldAdd.bind(this)(value, unit)
   }
+
   Dayjs.prototype.subtract = function (value, unit) {
-    if (isDuration(value)) value = value.asMilliseconds()
+    if (isDuration(value)) {
+      return manipulateDuration(this, value, -1)
+    }
+
     return oldSubtract.bind(this)(value, unit)
   }
 }
diff --git a/src/plugin/minMax/index.js b/src/plugin/minMax/index.js
index f515c60..8b3e2d3 100644
--- a/src/plugin/minMax/index.js
+++ b/src/plugin/minMax/index.js
@@ -1,12 +1,18 @@
 export default (o, c, d) => {
   const sortBy = (method, dates) => {
-    if (!dates || !dates.length || !dates[0] || (dates.length === 1 && !dates[0].length)) {
+    if (
+      !dates ||
+      !dates.length ||
+      (dates.length === 1 && !dates[0]) ||
+      (dates.length === 1 && Array.isArray(dates[0]) && !dates[0].length)
+    ) {
       return null
     }
     if (dates.length === 1 && dates[0].length > 0) {
       [dates] = dates
     }
-    let result
+    dates = dates.filter(date => date)
+    let result;
     [result] = dates
     for (let i = 1; i < dates.length; i += 1) {
       if (!dates[i].isValid() || dates[i][method](result)) {
diff --git a/src/plugin/objectSupport/index.js b/src/plugin/objectSupport/index.js
index 6501666..bd32358 100644
--- a/src/plugin/objectSupport/index.js
+++ b/src/plugin/objectSupport/index.js
@@ -1,6 +1,6 @@
 export default (o, c, dayjs) => {
   const proto = c.prototype
-  const isObject = obj => !(obj instanceof Date) && !(obj instanceof Array)
+  const isObject = obj => obj !== null && !(obj instanceof Date) && !(obj instanceof Array)
         && !proto.$utils().u(obj) && (obj.constructor.name === 'Object')
   const prettyUnit = (u) => {
     const unit = proto.$utils().p(u)
diff --git a/types/plugin/minMax.d.ts b/types/plugin/minMax.d.ts
index f167350..4c5f6dc 100644
--- a/types/plugin/minMax.d.ts
+++ b/types/plugin/minMax.d.ts
@@ -4,8 +4,8 @@ declare const plugin: PluginFunc
 export = plugin
 
 declare module 'dayjs' {
-  export function max(dayjs: Dayjs[]): Dayjs
-  export function max(...dayjs: Dayjs[]): Dayjs
-  export function min(dayjs: Dayjs[]): Dayjs
-  export function min(...dayjs: Dayjs[]): Dayjs
+  export function max(dayjs: Dayjs[]): Dayjs | null
+  export function max(...dayjs: Dayjs[]): Dayjs | null
+  export function min(dayjs: Dayjs[]): Dayjs | null
+  export function min(...dayjs: Dayjs[]): Dayjs | null
 }


Test patch:
diff --git a/test/constructor.test.js b/test/constructor.test.js
index b14b2fe..66cdbfc 100644
--- a/test/constructor.test.js
+++ b/test/constructor.test.js
@@ -13,6 +13,14 @@ it('supports instanceof dayjs', () => {
   expect(dayjs() instanceof dayjs).toBeTruthy()
 })
 
+it('$isDayjsObject', () => {
+  const mockOtherVersionDayjsObj = {
+    $isDayjsObject: true
+  }
+  expect(dayjs.isDayjs(mockOtherVersionDayjsObj)).toBeTruthy()
+})
+
 it('does not break isDayjs', () => {
   expect(dayjs.isDayjs(dayjs())).toBeTruthy()
+  expect(dayjs.isDayjs(new Date())).toBeFalsy()
 })
diff --git a/test/display.test.js b/test/display.test.js
index 86a978d..ce1f478 100644
--- a/test/display.test.js
+++ b/test/display.test.js
@@ -264,11 +264,7 @@ it('As ISO 8601 String -> toISOString e.g. 2013-02-04T22:44:30.652Z', () => {
 it('Year 1 formatted with YYYY should pad with zeroes', () => {
   const date = new Date(1, 0, 1)
   date.setUTCFullYear(1) // Required because 0-99 are parsed as 19xx in JS: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/Date#year
-  expect(dayjs(date).format('YYYY')).toBe('0001')
-})
-
-it('Year 1 formatting matches moment format', () => {
-  const date = new Date(1, 0, 1)
-  date.setUTCFullYear(1)
-  expect(dayjs(date).format('YYYY')).toBe(moment(date).format('YYYY'))
+  const res = dayjs(date).format('YYYY')
+  expect(res.slice(0, 3)).toBe('000') // because of timezone, the result might be 0000 0001 or 0002
+  expect(res).toBe(moment(date).format('YYYY'))
 })
diff --git a/test/locale/ar.test.js b/test/locale/ar.test.js
index 3f9f60f..2b5a57d 100644
--- a/test/locale/ar.test.js
+++ b/test/locale/ar.test.js
@@ -50,3 +50,13 @@ it('RelativeTime: Time from X gets formatted', () => {
       .toBe(t[2])
   })
 })
+
+it('Format meridiem with locale function', () => {
+  for (let i = 0; i <= 23; i += 1) {
+    const hour = dayjs()
+      .startOf('day')
+      .add(i, 'hour')
+    const meridiem = i > 12 ? 'م' : 'ص'
+    expect(hour.locale('ar').format('A')).toBe(`${meridiem}`)
+  }
+})
diff --git a/test/locale/sl.test.js b/test/locale/sl.test.js
new file mode 100644
index 0000000..672d606
--- /dev/null
+++ b/test/locale/sl.test.js
@@ -0,0 +1,82 @@
+import MockDate from 'mockdate'
+import dayjs from '../../src'
+import relativeTime from '../../src/plugin/relativeTime'
+import '../../src/locale/sl'
+
+dayjs.extend(relativeTime)
+
+beforeEach(() => {
+  MockDate.set(new Date())
+})
+
+afterEach(() => {
+  MockDate.reset()
+})
+
+it('Slovenian locale relative time in past and future', () => {
+  const cases = [
+    [1, 's', 'čez nekaj sekund', 'nekaj sekund'],
+    [-1, 's', 'pred nekaj sekundami', 'nekaj sekund'],
+    [1, 'm', 'čez eno minuto', 'ena minuta'],
+    [-1, 'm', 'pred eno minuto', 'ena minuta'],
+    [2, 'm', 'čez 2 minuti', '2 minuti'],
+    [-2, 'm', 'pred 2 minutama', '2 minuti'],
+    [3, 'm', 'čez 3 minute', '3 minute'],
+    [-3, 'm', 'pred 3 minutami', '3 minute'],
+    [5, 'm', 'čez 5 minut', '5 minut'],
+    [-5, 'm', 'pred 5 minutami', '5 minut'],
+    [1, 'h', 'čez eno uro', 'ena ura'],
+    [-1, 'h', 'pred eno uro', 'ena ura'],
+    [2, 'h', 'čez 2 uri', '2 uri'],
+    [-2, 'h', 'pred 2 urama', '2 uri'],
+    [3, 'h', 'čez 3 ure', '3 ure'],
+    [-3, 'h', 'pred 3 urami', '3 ure'],
+    [5, 'h', 'čez 5 ur', '5 ur'],
+    [-5, 'h', 'pred 5 urami', '5 ur'],
+    [1, 'd', 'čez en dan', 'en dan'],
+    [-1, 'd', 'pred enim dnem', 'en dan'],
+    [2, 'd', 'čez 2 dneva', '2 dneva'],
+    [-2, 'd', 'pred 2 dnevoma', '2 dneva'],
+    [3, 'd', 'čez 3 dni', '3 dni'],
+    [-3, 'd', 'pred 3 dnevi', '3 dni'],
+    [5, 'd', 'čez 5 dni', '5 dni'],
+    [-5, 'd', 'pred 5 dnevi', '5 dni'],
+    [1, 'M', 'čez en mesec', 'en mesec'],
+    [-1, 'M', 'pred enim mesecem', 'en mesec'],
+    [2, 'M', 'čez 2 meseca', '2 meseca'],
+    [-2, 'M', 'pred 2 mesecema', '2 meseca'],
+    [3, 'M', 'čez 3 mesece', '3 mesece'],
+    [-3, 'M', 'pred 3 meseci', '3 mesece'],
+    [5, 'M', 'čez 5 mesecev', '5 mesecev'],
+    [-5, 'M', 'pred 5 meseci', '5 mesecev'],
+    [1, 'y', 'čez eno leto', 'eno leto'],
+    [-1, 'y', 'pred enim letom', 'eno leto'],
+    [2, 'y', 'čez 2 leti', '2 leti'],
+    [-2, 'y', 'pred 2 letoma', '2 leti'],
+    [3, 'y', 'čez 3 leta', '3 leta'],
+    [-3, 'y', 'pred 3 leti', '3 leta'],
+    [5, 'y', 'čez 5 let', '5 let'],
+    [-5, 'y', 'pred 5 leti', '5 let']
+    // these are rounded
+    // if user decides to change rounding then it would be good to test them also
+    // [102, 's', 'čez 102 sekundi', '102 sekundi'],
+    // [-102, 's', 'pred 102 sekundama', '102 sekundi'],
+    // [103, 's', 'čez 103 sekunde', '103 sekunde'],
+    // [-103, 's', 'pred 103 sekundami', '103 sekunde'],
+    // [114, 's', 'čez 114 sekund', '114 sekund'],
+    // [-114, 's', 'pred 114 sekundami', '114 sekund'],
+    // [-102, 'm', 'čez 102 minuti', '102 minuti'],
+    // [-102, 'm', 'pred 102 minutama', '102 minuti'],
+    // [103, 'm', 'čez 103 minute', '103 minute'],
+    // [-103, 'm', 'pred 103 minutami', '103 minute'],
+    // [114, 'm', 'čez 114 minut', '114 minut'],
+    // [-114, 'm', 'pred 114 minutami', '114 minut']
+  ]
+
+  cases.forEach((c) => {
+    // With suffix
+    expect(dayjs().add(c[0], c[1]).locale('sl').fromNow()).toBe(c[2])
+    // Without suffix
+    expect(dayjs().add(c[0], c[1]).locale('sl').fromNow(true)).toBe(c[3])
+  })
+})
diff --git a/test/plugin/duration.test.js b/test/plugin/duration.test.js
index 8a7e0e6..3e726af 100644
--- a/test/plugin/duration.test.js
+++ b/test/plugin/duration.test.js
@@ -70,6 +70,22 @@ describe('Creating', () => {
   it('convert to milliseconds', () => {
     expect(+dayjs.duration(100)).toBe(100)
   })
+  it('handles rounding to millisecond precision', () => {
+    expect(dayjs.duration(2 / 3).toISOString()).toBe('PT0.001S')
+  })
+  it('should handle round with millisecond precision when negative', () => {
+    expect(dayjs.duration(1000.5).toISOString()).toBe('PT1.001S')
+    expect(dayjs.duration(-1000.5).toISOString()).toBe('-PT1S')
+  })
+  it('should handle floating point rounding errors', () => {
+    // An example of this is when adding 2 to 0.812 seconds, which is how
+    // the seconds component is calculated in .toISOString().
+    // > 2 + 0.812
+    // 2.8120000000000003
+    expect(dayjs.duration(-2812).toISOString()).toBe('-PT2.812S') // was -PT2.8120000000000003S
+    expect(dayjs.duration(3121632.27382247).toISOString()).toBe('PT52M1.632S') // was PT52M1.6320000000000001S
+    expect(dayjs.duration(7647826.525774224).toISOString()).toBe('PT2H7M27.827S') // was PT2H7M27.826999999999998S
+  })
 })
 
 describe('Parse ISO string', () => {
@@ -85,8 +101,9 @@ describe('Parse ISO string', () => {
   it('ISO string with week', () => {
     const d = dayjs.duration('P2M3W4D')
     expect(d.toISOString()).toBe('P2M25D')
-    expect(d.asDays()).toBe(85) // moment 85, count 2M as 61 days
-    expect(d.asWeeks()).toBe(12.142857142857142) // moment 12.285714285714286
+    expect(d.asDays()).toBe(85.83333333333333) // moment 86, count 2M as 61 days
+    expect(d.asWeeks()).toBe(12.261904761904763) // moment 12.285714285714286
+    expect(d.asMonths()).toBe(2.8219178082191783) // moment 2.8213721020965523
   })
   it('Invalid ISO string', () => {
     expect(dayjs.duration('Invalid').toISOString()).toBe('P0D')
@@ -178,10 +195,20 @@ describe('Add', () => {
   expect(a.add({ days: 5 }).days()).toBe(6)
 })
 
+describe('Add to a dayjs()', () => {
+  const a = dayjs()
+  const b = dayjs.duration({ hours: 7, minutes: 10 })
+  expect(a.add(b)).toEqual(a.add(7, 'hours').add(10, 'minutes'))
+})
+
 test('Add duration', () => {
   const a = dayjs('2020-10-01')
   const days = dayjs.duration(2, 'days')
   expect(a.add(days).format('YYYY-MM-DD')).toBe('2020-10-03')
+
+  const b = dayjs('2023-02-01 00:00:00')
+  const p = dayjs.duration('P1Y1M1DT1H1M1S')
+  expect(b.add(p).format('YYYY-MM-DD HH:mm:ss')).toBe('2024-03-02 01:01:01')
 })
 
 describe('Subtract', () => {
@@ -194,6 +221,10 @@ test('Subtract duration', () => {
   const a = dayjs('2020-10-20')
   const days = dayjs.duration(2, 'days')
   expect(a.subtract(days).format('YYYY-MM-DD')).toBe('2020-10-18')
+
+  const b = dayjs('2023-03-02 02:02:02')
+  const p = dayjs.duration('P1Y1M1DT1H1M1S')
+  expect(b.subtract(p).format('YYYY-MM-DD HH:mm:ss')).toBe('2022-02-01 01:01:01')
 })
 
 describe('Seconds', () => {
diff --git a/test/plugin/minMax.test.js b/test/plugin/minMax.test.js
index eeef920..f8a5080 100644
--- a/test/plugin/minMax.test.js
+++ b/test/plugin/minMax.test.js
@@ -55,3 +55,17 @@ it('If Invalid Date return Invalid Date', () => {
   expect(dayjs.min([arg1, arg2, arg3, arg4]).format())
     .toBe(arg4.format())
 })
+
+it('Ignore if exists an "null" argument', () => {
+  expect(dayjs.max(null, null, arg1, arg2, null, arg3).format())
+    .toBe(arg1.format())
+  expect(dayjs.min([null, null, arg1, arg2, null, arg3]).format())
+    .toBe(arg3.format())
+})
+
+it('Return the only date if just provided one argument', () => {
+  expect(dayjs.max(arg1).format())
+    .toBe(arg1.format())
+  expect(dayjs.min([arg1]).format())
+    .toBe(arg1.format())
+})
diff --git a/test/plugin/objectSupport.test.js b/test/plugin/objectSupport.test.js
index 06b10f9..abf046d 100755
--- a/test/plugin/objectSupport.test.js
+++ b/test/plugin/objectSupport.test.js
@@ -140,6 +140,12 @@ it('Constructor from Object UTC', () => {
     expect(moment.utc(tests[i][0]).format(fmt)).toBe(result)
   }
 })
+
+it('Constructor from null should return Invalid Date', () => {
+  expect(dayjs(null).isValid()).toBe(false)
+  expect(moment(null).isValid()).toBe(false)
+})
+
 it('Set from Object', () => {
   for (let i = 0; i < tests.length; i += 1) {
     expect(dayjs(now).set(tests[i][0]).format(fmt)).toBe(moment(now).set(tests[i][0]).format(fmt))
@@ -384,3 +390,11 @@ it('add decimal values of days and months', () => {
   expect(dayjs([2016, 7, 1]).add(1.6, 'years').format('YYYY-MM-DD')).toBe('2017-07-01')
   expect(dayjs([2016, 1, 1]).add(1.1, 'quarters').format('YYYY-MM-DD')).toBe('2016-04-01')
 })
+
+it('returns valid date on undefined', () => {
+  expect(dayjs().isValid()).toBe(true)
+})
+
+it('returns invalid date on null', () => {
+  expect(dayjs(null).isValid()).toBe(false)
+})