RTClib has the toString() function to convert to a char array, otherwise you can use sprintf() along with the library functions to get the individual elements of the time (year, day, month, hour, etc).
Here is the description of toString() from the library:
/**************************************************************************/
/*!
@brief Writes the DateTime as a string in a user-defined format.
The _buffer_ parameter should be initialized by the caller with a string
specifying the requested format. This format string may contain any of
the following specifiers:
| specifier | output |
|-----------|--------------------------------------------------------|
| YYYY | the year as a 4-digit number (2000--2099) |
| YY | the year as a 2-digit number (00--99) |
| MM | the month as a 2-digit number (01--12) |
| MMM | the abbreviated English month name ("Jan"--"Dec") |
| DD | the day as a 2-digit number (01--31) |
| DDD | the abbreviated English day of the week ("Mon"--"Sun") |
| AP | either "AM" or "PM" |
| ap | either "am" or "pm" |
| hh | the hour as a 2-digit number (00--23 or 01--12) |
| mm | the minute as a 2-digit number (00--59) |
| ss | the second as a 2-digit number (00--59) |
If either "AP" or "ap" is used, the "hh" specifier uses 12-hour mode
(range: 01--12). Otherwise it works in 24-hour mode (range: 00--23).
The specifiers within _buffer_ will be overwritten with the appropriate
values from the DateTime. Any characters not belonging to one of the
above specifiers are left as-is.
__Example__: The format "DDD, DD MMM YYYY hh:mm:ss" generates an output
of the form "Thu, 16 Apr 2020 18:34:56.
@see The `timestamp()` method provides similar functionnality, but it
returns a `String` object and supports a limited choice of
predefined formats.
@param[in,out] buffer Array of `char` for holding the format description
and the formatted DateTime. Before calling this method, the buffer
should be initialized by the user with the format string. The method
will overwrite the buffer with the formatted date and/or time.
@return A pointer to the provided buffer. This is returned for
convenience, in order to enable idioms such as
`Serial.println(now.toString(buffer));`
*/
/**************************************************************************/
char *DateTime::toString(char *buffer) const {