diff --git a/.codespellrc b/.codespellrc
index 101edae..3372dc8 100644
--- a/.codespellrc
+++ b/.codespellrc
@@ -1,7 +1,7 @@
 # See: https://github.com/codespell-project/codespell#using-a-config-file
 [codespell]
 # In the event of a false positive, add the problematic word, in all lowercase, to a comma-separated list here:
-ignore-words-list = ,
+ignore-words-list = leapyears
 check-filenames =
 check-hidden =
 skip = ./.git
diff --git a/NTPClient.cpp b/NTPClient.cpp
index b435855..f83c526 100755
--- a/NTPClient.cpp
+++ b/NTPClient.cpp
@@ -136,7 +136,7 @@ unsigned long NTPClient::getEpochTime() const {
          ((millis() - this->_lastUpdate) / 1000); // Time since last update
 }
 
-int NTPClient::getDay() const {
+int NTPClient::getDayOfWeek() const {
   return (((this->getEpochTime()  / 86400L) + 4 ) % 7); //0 is Sunday
 }
 int NTPClient::getHours() const {
@@ -149,6 +149,97 @@ int NTPClient::getSeconds() const {
   return (this->getEpochTime() % 60);
 }
 
+int NTPClient::getDay() const {
+
+  long days = this->getEpochTime()  / 86400L;
+  int fullYears = days / 365;
+  int overDays = days % 365;
+
+  int leapYears = (fullYears - 2) / 4;
+  if (leapYears > overDays) {
+	fullYears--;
+  }
+
+  int currentYear = 1970 + fullYears;
+
+  int thisYearIsLeap = currentYear % 4 == 0 ? 1 : 0;
+
+  int dayOfYear = (days - leapYears) % ( 365 + thisYearIsLeap);
+  if(dayOfYear == 0) {
+	dayOfYear = 365 + thisYearIsLeap;
+  }
+
+  int daysInMonth[12] = {31, 28 + thisYearIsLeap, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
+
+  for( int month = 0; month < 12; month++) {
+	if(dayOfYear < daysInMonth[month]) {
+		return dayOfYear;
+	} else {
+		dayOfYear -= daysInMonth[month];
+	}
+  }
+
+  return -1;
+}
+
+int NTPClient::getMonth() const {
+
+  long days = this->getEpochTime()  / 86400L;
+  int fullYears = days / 365;
+  int overDays = days % 365;
+
+  int leapYears = (fullYears - 2) / 4;
+  if (leapYears > overDays) {
+	fullYears--;
+  }
+
+  int currentYear = 1970 + leapYears;
+
+  int thisYearIsLeap = currentYear % 4 == 0 ? 1 : 0;
+
+  int dayOfYear = (days - leapYears) % ( 365 + thisYearIsLeap);
+  if(dayOfYear == 0) {
+	dayOfYear = 365 + thisYearIsLeap;
+  }
+
+  int daysInMonth[12] = {31, 28 + thisYearIsLeap, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
+
+  for( int month = 0; month < 12; month++) {
+	if(dayOfYear < daysInMonth[month]) {
+		return month + 1;
+	} else {
+		dayOfYear -= daysInMonth[month];
+	}
+  }
+
+  return -1;
+}
+
+int NTPClient::getYear() const {
+  long days = this->getEpochTime()  / 86400L;
+  int fullYears = days / 365;
+  int overDays = days % 365;
+
+  int leapYears = (fullYears - 2) / 4;
+
+  if (leapYears > overDays) {
+	fullYears--;
+  }
+  return 1970 + fullYears;
+}
+
+String NTPClient::getFormattedDate() const {
+  String yearStr = String(this->getYear());
+
+  unsigned int month = this->getMonth();
+  String monthStr = month < 10 ? "0" + String(month) : String(month);
+
+  unsigned int day = this->getDay();
+  String dayStr = day < 10 ? "0" + String(day) : String(day);
+
+  return yearStr + "-" + monthStr + "-" + dayStr;
+}
+
 String NTPClient::getFormattedTime() const {
   unsigned long rawTime = this->getEpochTime();
   unsigned long hours = (rawTime % 86400L) / 3600;
@@ -163,6 +254,10 @@ String NTPClient::getFormattedTime() const {
   return hoursStr + ":" + minuteStr + ":" + secondStr;
 }
 
+String NTPClient::getFormattedDateTime() const {
+  return this->getFormattedDate() + "T" + this->getFormattedTime();
+}
+
 void NTPClient::end() {
   this->_udp->stop();
 
diff --git a/NTPClient.h b/NTPClient.h
index a31d32f..1ea7f56 100755
--- a/NTPClient.h
+++ b/NTPClient.h
@@ -81,10 +81,13 @@ class NTPClient {
      */
     bool isTimeSet() const;
 
-    int getDay() const;
     int getHours() const;
     int getMinutes() const;
     int getSeconds() const;
+    int getDayOfWeek() const;
+    int getDay() const;
+    int getMonth() const;
+    int getYear() const;
 
     /**
      * Changes the time offset. Useful for changing timezones dynamically
@@ -97,11 +100,21 @@ class NTPClient {
      */
     void setUpdateInterval(unsigned long updateInterval);
 
+     /**
+     * @return date formatted like `YYYY-MM-DD`
+     */
+    String getFormattedDate() const;
+
     /**
      * @return time formatted like `hh:mm:ss`
      */
     String getFormattedTime() const;
 
+    /**
+     * @return datetime formatted like `YYYY-MM-DDTHH:mm:ss`
+     */
+    String getFormattedDateTime() const;
+
     /**
      * @return time in seconds since Jan. 1, 1970
      */
diff --git a/keywords.txt b/keywords.txt
index edce989..c803a4b 100644
--- a/keywords.txt
+++ b/keywords.txt
@@ -13,11 +13,16 @@ end	KEYWORD2
 update	KEYWORD2
 forceUpdate	KEYWORD2
 isTimeSet	KEYWORD2
-getDay	KEYWORD2
 getHours	KEYWORD2
 getMinutes	KEYWORD2
 getSeconds	KEYWORD2
+getDayOfWeek	KEYWORD2
+getDay	KEYWORD2
+getMonth	KEYWORD2
+getYear	KEYWORD2
+getFormattedDate	KEYWORD2
 getFormattedTime	KEYWORD2
+getFormattedDateTime	KEYWORD2
 getEpochTime	KEYWORD2
 setTimeOffset	KEYWORD2
 setUpdateInterval	KEYWORD2