Converting date string format in Perl for MySQL database insertion

I’m having trouble converting a date string in Perl so it works with MySQL database fields. I have a timestamp that looks like this:

my $timestamp = "Mon Jul 15 14:35:42 2024 -0500"

I need to change this format to work with MySQL DATETIME columns which expect this pattern:

YYYY-MM-DD HH:MM:SS

I want to insert this data using Perl’s DBI module like this:

my $insertSQL = "INSERT INTO events (event_date) VALUES(?)"
my $statement = $database->prepare($insertSQL)
$statement->execute($timestamp)

What’s the best way to parse and reformat this date string in Perl before sending it to MySQL?

interesting timestamp format! Is this from a system log or API response? the timezone offset caught my eye - do you need to handle different timezones consistently when storing in MySQL?

Time::Piece works great for this conversion. Just parse your timestamp and output it in MySQL format. Here’s what I’ve used:

use Time::Piece;

my $timestamp = "Mon Jul 15 14:35:42 2024 -0500";
my $t = Time::Piece->strptime($timestamp, "%a %b %d %H:%M:%S %Y %z");
my $mysql_format = $t->strftime("%Y-%m-%d %H:%M:%S");

It handles timezone conversion automatically and gives you a clean string for MySQL. Time::Piece comes with Perl core, so no extra installs needed. It reads the timezone offset and converts to your system’s local time - usually what you want for database storage.

datetime::format::strptime works great for weird formats when you need more control. I switched to it when time::piece couldn’t handle things. Just make sure your mysql timezone is set, or you might get some confusing results!