Index: wp-includes/functions.php
===================================================================
--- wp-includes/functions.php	(revision 18444)
+++ wp-includes/functions.php	(working copy)
@@ -142,6 +142,224 @@
 }
 
 /**
+ * Builds a regular expression allowing to match a date formatted according to the specified format
+ *
+ * @param string Format of the date
+ * @param string Regular expression delimiters
+ * @return bool|string a string representing the built regular expression, or false in case of an error or if no format element is used
+ */
+function build_date_parse_regexp_from_format( $format, $delimiter = '/' ) {
+	// Regular expressions used to parse the date
+	$replacements = array(
+		'd' => '([0-2][0-9]|3[0-1])',
+		'D' => '(Sun|Mon|Tue|Wed|Thu|Fri|Sat)',
+		'j' => '([1-9]|[1-2][0-9]|3[0-1])',
+		'l' => '(Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday)',
+		'S' => '(st|nd|rd|th)',
+		'z' => '(\d{1,3})',
+		'F' => '(January|February|March|April|May|June|July|August|September|October|November|December)',
+		'M' => '(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)',
+		'm' => '(0[1-9]|1[0-2])',
+		'n' => '([1-9]|1[0-2])',
+		'Y' => '(\d{4})',
+		'y' => '(\d{2})',
+		'a' => '(am|pm)',
+		'A' => '(AM|PM)',
+		'g' => '([0-9]|1[0-2])',
+		'h' => '(0[0-9]|1[0-2])',
+		'G' => '([0-9]|1[0-9]|2[0-3])',
+		'H' => '([0-1][0-9]|2[0-3])',
+		'i' => '([0-5][0-9])',
+		's' => '([0-5][0-9])',
+		'u' => '(\d{1,6})',
+		'U' => '(\d{1,10})',
+		'e' => '([a-zA-Z-\/]+(?:\+\d+)?)',
+		'O' => '((?:\+|-)\d{4})',
+		'P' => '((?:\+|-)\d{2}:\d{2})',
+		'T' => '([A-Z]+)',
+	);
+	
+	// Looking for used format elements
+	$parsed_format = $format;
+	$used_replacements = array();
+	foreach ( $replacements as $k => $v ) {
+		if ( ( $p = strpos( $format, $k ) ) !== false ) {
+			$parsed_format = str_replace( $k, "%{$k}%", $parsed_format );
+			$used_replacements[$k] = $v;
+		}
+	}
+	
+	if ( !empty( $used_replacements ) ) {
+		// Computing sources elements to create the regular expression
+		$replacement_keys = array_map( create_function( '$a', 'return "%{$a}%";' ), array_keys( $used_replacements ) );
+			
+		// Building the regular expression
+		return $delimiter . '^' . str_replace( '/', '\/', str_replace( $replacement_keys, array_values( $used_replacements ), $parsed_format ) ) . '$' . $delimiter;
+	}
+	else
+		return false;
+}
+
+/**
+ * Get info about given date formatted according to the specified format
+ *
+ * This function is a placeholder for the PHP 5.3+ date_parse_from_format() function.
+ * Please visit the official function documentation for further information :
+ * http://fr.php.net/manual/fr/function.date-parse-from-format.php
+ *
+ * This function differs from its original version in its return values :
+ * it returns false in case of an error instead of including errors in the returned array
+ * and it does not support format modifiers such as '+' or '!' (yet)
+ *
+ * @param string Format of the date
+ * @param string Date to parse
+ * @return bool|array an array containing the date components, or false in case of an error
+ */
+if ( !function_exists( 'date_parse_from_format' ) )
+{
+	function date_parse_from_format( $format, $date ) {
+		// Regular expressions used to parse the date
+		$replacements = array(
+			'd' => '([0-2][0-9]|3[0-1])',
+			'D' => array( 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat' ),
+			'j' => '([1-9]|[1-2][0-9]|3[0-1])',
+			'l' => array( 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday' ),
+			'S' => array( 'st', 'nd', 'rd', 'th' ),
+			'z' => '(\d{1,3})',
+			'F' => array( 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ),
+			'M' => array( 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ),
+			'm' => '(0[1-9]|1[0-2])',
+			'n' => '([1-9]|1[0-2])',
+			'Y' => '(\d{4})',
+			'y' => '(\d{2})',
+			'a' => '(am|pm)',
+			'A' => array( 'AM', 'PM' ),
+			'g' => '([0-9]|1[0-2])',
+			'h' => '(0[0-9]|1[0-2])',
+			'G' => '([0-9]|1[0-9]|2[0-3])',
+			'H' => '([0-1][0-9]|2[0-3])',
+			'i' => '([0-5][0-9])',
+			's' => '([0-5][0-9])',
+			'u' => '(\d{1,6})',
+			'U' => '(\d{1,10})',
+			'e' => '([a-zA-Z-\/]+(?:\+\d+)?)',
+			'O' => '((?:\+|-)\d{4})',
+			'P' => '((?:\+|-)\d{2}:\d{2})',
+			'T' => '([A-Z]+)',
+		);
+		
+		// Looking for used format elements
+		$parsed_format = $format;
+		$used_replacements = array();
+		$used_replacements_indices = array();
+		foreach ( $replacements as $k => $v ) {
+			if ( ( $p = strpos( $format, $k ) ) !== false ) {
+				$parsed_format = str_replace( $k, "%{$k}%", $parsed_format );
+				$used_replacements[$k] = $v;
+				$used_replacements_indices[$p] = $k;
+			}
+		}
+		
+		// If a format element has been found
+		if ( !empty( $used_replacements ) ) {
+			// Sort format elements to be in the same order as the results of the regular expression
+			ksort( $used_replacements_indices );
+		
+			// Computing sources and replacements elements to create the regular expression
+			$replacement_keys = array_map( create_function( '$a', 'return "%{$a}%";' ), array_keys( $used_replacements ) );
+			$replacement_values = array_map( create_function( '$a', 'return is_array($a) ? ("(" . implode("|", $a) . ")") : $a;' ), array_values( $used_replacements ) );
+			
+			// Applying the regular expression
+			$regexp = '/^' . str_replace( '/', '\/', str_replace( $replacement_keys, $replacement_values, $parsed_format ) ) . '$/';
+			if ( !preg_match( $regexp, $date, $regs ) )
+				return false;
+			
+			// Retrieving regular expression result for each format element
+			$members = array();
+			$i = 1;
+			foreach ( $used_replacements_indices as $v ) {
+				$members[$v] = $regs[$i++];
+			}
+			
+			// Computing results
+			$result = array(
+				'day' => false,
+				'month' => false,
+				'year' => false,
+				'hour' => 0,
+				'minute' => 0,
+				'second' => 0,
+				'fraction' => false
+			);
+			foreach ( $members as $k => $v ) {
+				switch ($k)
+				{
+					case 'd':
+					case 'j':
+						$result['day'] = intval( $v );
+						break;
+					
+					case 'M':
+					case 'F':
+						$result['month'] = array_search( $v, $replacements[$k] ) + 1;
+						break;
+					
+					case 'm':
+					case 'n':
+						$result['month'] = intval( $v );
+						break;
+						
+					case 'Y':
+						$result['year'] = intval( $v );
+						break;
+					
+					case 'y':
+						$result['year'] = intval( $v );
+						if ( $result['year'] < 70 )
+							$result['year'] += 2000;
+						else
+							$result['year'] += 1900;
+						break;
+						
+					case 'H':
+					case 'h':
+						$result['hour'] = intval( $v );
+						if ( ( !empty( $members['a'] ) && $members['a'] == 'pm' ) || ( !empty( $members['A'] ) && $members['A'] == 'PM' ) )
+							$result['hour'] += 12;
+						break;
+						
+					case 'i':
+						$result['minute'] = intval( $v );
+						break;
+						
+					case 's':
+						$result['second'] = intval( $v );
+						break;
+						
+					case 'u':
+						$result['fraction'] = floatval( $v );
+						break;
+						
+					case 'U':
+						$ts = intval($v);
+						$result['day'] = date( 'j', $ts );
+						$result['month'] = date( 'n', $ts );
+						$result['year'] = date( 'Y', $ts );
+						$result['hour'] = date( 'G', $ts );
+						$result['minute'] = date( 'i', $ts );
+						$result['second'] = date( 's', $ts );
+						$result = array_map( 'intval', $result );
+						break;
+				}
+			}
+			return $result;
+		}
+		else
+			return false;
+	}
+}
+
+/**
  * Convert integer number to format based on the locale.
  *
  * @since 2.3.0
Index: wp-includes/script-loader.php
===================================================================
--- wp-includes/script-loader.php	(revision 18444)
+++ wp-includes/script-loader.php	(working copy)
@@ -68,7 +68,17 @@
 	$scripts->add_data( 'common', 'group', 1 );
 	$scripts->localize( 'common', 'commonL10n', array(
 		'warnDelete' => __("You are about to permanently delete the selected items.\n  'Cancel' to stop, 'OK' to delete."),
-		'l10n_print_after' => 'try{convertEntities(commonL10n);}catch(e){};'
+		'l10n_print_after' => 'try{convertEntities(commonL10n);}catch(e){};',
+		
+		'datePicker_dateFormat' => __('mm/dd/yy'),
+		'datePicker_firstDay' => get_option('start_of_week'),
+		
+		'timePicker_hourText' => __('Hour'),
+		'timePicker_minuteText' => __('Minute'),
+			
+		'date_regexp' => str_replace( '\\', '\\\\', build_date_parse_regexp_from_format( __('m/d/Y'), '' ) ),
+		'date_components_order' => __('month,day,year'),
+		'time_regexp' => str_replace( '\\', '\\\\', build_date_parse_regexp_from_format( __('H:i'), '' ) )
 	) );
 
 	$scripts->add( 'sack', "/wp-includes/js/tw-sack$suffix.js", false, '1.6.1' );
@@ -164,7 +174,25 @@
 
 	$scripts->add( 'jquery-ui-dialog', '/wp-includes/js/jquery/ui.dialog.js', array('jquery-ui-resizable', 'jquery-ui-draggable', 'jquery-ui-button', 'jquery-ui-position'), '1.8.12' );
 	$scripts->add_data( 'jquery-ui-dialog', 'group', 1 );
+	
+	$scripts->add( 'jquery-ui-timepicker', '/wp-includes/js/jquery/ui.timepicker.js', array('jquery-ui-core'), '0.2.3' );
+	$scripts->add_data( 'jquery-ui-timepicker', 'group', 1 );
 
+	$scripts->add( 'jquery-ui-datepicker', '/wp-includes/js/jquery/ui.datepicker.js', array('jquery-ui-core'), '1.8.12' );
+	$scripts->add_data( 'jquery-ui-datepicker', 'group', 1 );
+	
+	$locale_chunks = explode( '_', get_locale() );
+	$jquery_datepicker_language_file = '/wp-includes/js/jquery/ui.datepicker.i18n/jquery.ui.datepicker-' . implode( '-', $locale_chunks ) . '.js';
+	if ( !file_exists( ABSPATH . $jquery_datepicker_language_file ) ) {
+		$jquery_datepicker_language_file = '/wp-includes/js/jquery/ui.datepicker.i18n/jquery.ui.datepicker-' . $locale_chunks[0] . '.js';
+		if ( !file_exists( ABSPATH . $jquery_datepicker_language_file ) )
+			unset( $jquery_datepicker_language_file );
+	}
+	if ( !empty( $jquery_datepicker_language_file ) ) {
+		$scripts->add( 'jquery-ui-datepicker-i18n', $jquery_datepicker_language_file, array('jquery-ui-core', 'jquery-ui-datepicker'), '1.8.12' );
+		$scripts->add_data( 'jquery-ui-datepicker-i18n', 'group', 1 );
+	}
+
 	// deprecated, not used in core, most functionality is included in jQuery 1.3
 	$scripts->add( 'jquery-form', "/wp-includes/js/jquery/jquery.form$suffix.js", array('jquery'), '2.73');
 	$scripts->add_data( 'jquery-form', 'group', 1 );
@@ -516,6 +544,10 @@
 	$styles->add( 'admin-bar', "/wp-includes/css/admin-bar$suffix.css", array(), '20110622' );
 	$styles->add( 'wp-jquery-ui-dialog', "/wp-includes/css/jquery-ui-dialog$suffix.css", array(), '20101224' );
 	$styles->add( 'wplink', "/wp-includes/js/tinymce/plugins/wplink/css/wplink$suffix.css", array(), '20101224' );
+	$styles->add( 'jquery-ui-core', "/wp-includes/css/jquery-ui-core.css", array(), '20110717' );
+	$styles->add( 'jquery-ui-theme', "/wp-includes/css/jquery-ui-theme.css", array(), '20110717' );
+	$styles->add( 'jquery-ui-timepicker', "/wp-includes/css/jquery-ui-timepicker.css", array(), '20110622' );
+	$styles->add( 'jquery-ui-datepicker', "/wp-includes/css/jquery-ui-datepicker.css", array(), '20110717' );
 
 	foreach ( $rtl_styles as $rtl_style ) {
 		$styles->add_data( $rtl_style, 'rtl', true );
Index: wp-admin/includes/post.php
===================================================================
--- wp-admin/includes/post.php	(revision 18444)
+++ wp-admin/includes/post.php	(working copy)
@@ -101,7 +101,7 @@
 	if (!isset( $post_data['ping_status'] ))
 		$post_data['ping_status'] = 'closed';
 
-	foreach ( array('aa', 'mm', 'jj', 'hh', 'mn') as $timeunit ) {
+	foreach ( array('dd', 'tt') as $timeunit ) {
 		if ( !empty( $post_data['hidden_' . $timeunit] ) && $post_data['hidden_' . $timeunit] != $post_data[$timeunit] ) {
 			$post_data['edit_date'] = '1';
 			break;
@@ -109,21 +109,26 @@
 	}
 
 	if ( !empty( $post_data['edit_date'] ) ) {
-		$aa = $post_data['aa'];
-		$mm = $post_data['mm'];
-		$jj = $post_data['jj'];
-		$hh = $post_data['hh'];
-		$mn = $post_data['mn'];
-		$ss = $post_data['ss'];
-		$aa = ($aa <= 0 ) ? date('Y') : $aa;
-		$mm = ($mm <= 0 ) ? date('n') : $mm;
-		$jj = ($jj > 31 ) ? 31 : $jj;
-		$jj = ($jj <= 0 ) ? date('j') : $jj;
-		$hh = ($hh > 23 ) ? $hh -24 : $hh;
-		$mn = ($mn > 59 ) ? $mn -60 : $mn;
-		$ss = ($ss > 59 ) ? $ss -60 : $ss;
-		$post_data['post_date'] = sprintf( "%04d-%02d-%02d %02d:%02d:%02d", $aa, $mm, $jj, $hh, $mn, $ss );
-		$post_data['post_date_gmt'] = get_gmt_from_date( $post_data['post_date'] );
+		$date_str = sprintf( '%s %s', trim( $post_data['dd'] ), trim( $post_data['tt'] ) );
+		$date_format_str = sprintf( '%s H:i', __( 'm/d/Y' ) );
+		$result = date_parse_from_format( $date_format_str, $date_str );
+		if ( !empty( $result ) && empty( $result['warning_count'] ) && empty( $result['error_count'] ) ) {
+			$aa = $result['year'];
+			$mm = $result['month'];
+			$jj = $result['day'];
+			$hh = $result['hour'];
+			$mn = $result['minute'];
+			$ss = $post_data['ss'];
+			$aa = ($aa <= 0 ) ? date('Y') : $aa;
+			$mm = ($mm <= 0 ) ? date('n') : $mm;
+			$jj = ($jj > 31 ) ? 31 : $jj;
+			$jj = ($jj <= 0 ) ? date('j') : $jj;
+			$hh = ($hh > 23 ) ? $hh -24 : $hh;
+			$mn = ($mn > 59 ) ? $mn -60 : $mn;
+			$ss = ($ss > 59 ) ? $ss -60 : $ss;
+			$post_data['post_date'] = sprintf( "%04d-%02d-%02d %02d:%02d:%02d", $aa, $mm, $jj, $hh, $mn, $ss );
+			$post_data['post_date_gmt'] = get_gmt_from_date( $post_data['post_date'] );
+		}
 	}
 
 	return $post_data;
Index: wp-admin/includes/comment.php
===================================================================
--- wp-admin/includes/comment.php	(revision 18444)
+++ wp-admin/includes/comment.php	(working copy)
@@ -43,7 +43,7 @@
 	$_POST['comment_content'] = $_POST['content'];
 	$_POST['comment_ID'] = (int) $_POST['comment_ID'];
 
-	foreach ( array ('aa', 'mm', 'jj', 'hh', 'mn') as $timeunit ) {
+	foreach ( array ('dd', 'tt') as $timeunit ) {
 		if ( !empty( $_POST['hidden_' . $timeunit] ) && $_POST['hidden_' . $timeunit] != $_POST[$timeunit] ) {
 			$_POST['edit_date'] = '1';
 			break;
@@ -51,17 +51,26 @@
 	}
 
 	if ( !empty ( $_POST['edit_date'] ) ) {
-		$aa = $_POST['aa'];
-		$mm = $_POST['mm'];
-		$jj = $_POST['jj'];
-		$hh = $_POST['hh'];
-		$mn = $_POST['mn'];
-		$ss = $_POST['ss'];
-		$jj = ($jj > 31 ) ? 31 : $jj;
-		$hh = ($hh > 23 ) ? $hh -24 : $hh;
-		$mn = ($mn > 59 ) ? $mn -60 : $mn;
-		$ss = ($ss > 59 ) ? $ss -60 : $ss;
-		$_POST['comment_date'] = "$aa-$mm-$jj $hh:$mn:$ss";
+		$date_str = sprintf( '%s %s', trim( $_POST['dd'] ), trim( $_POST['tt'] ) );
+		$date_format_str = sprintf( '%s H:i', __( 'm/d/Y' ) );
+		$result = date_parse_from_format( $date_format_str, $date_str );
+		
+		if ( !empty( $result ) && empty( $result['warning_count'] ) && empty( $result['error_count'] ) ) {
+			$aa = $result['year'];
+			$mm = $result['month'];
+			$jj = $result['day'];
+			$hh = $result['hour'];
+			$mn = $result['minute'];
+			$ss = $_POST['ss'];
+			$aa = ($aa <= 0 ) ? date('Y') : $aa;
+			$mm = ($mm <= 0 ) ? date('n') : $mm;
+			$jj = ($jj > 31 ) ? 31 : $jj;
+			$jj = ($jj <= 0 ) ? date('j') : $jj;
+			$hh = ($hh > 23 ) ? $hh -24 : $hh;
+			$mn = ($mn > 59 ) ? $mn -60 : $mn;
+			$ss = ($ss > 59 ) ? $ss -60 : $ss;
+			$_POST['comment_date'] = sprintf( "%04d-%02d-%02d %02d:%02d:%02d", $aa, $mm, $jj, $hh, $mn, $ss );
+		}
 	}
 
 	wp_update_comment( $_POST );
Index: wp-admin/includes/template.php
===================================================================
--- wp-admin/includes/template.php	(revision 18444)
+++ wp-admin/includes/template.php	(working copy)
@@ -280,11 +280,8 @@
 	<div class="comment_status">' . esc_html( $post->comment_status ) . '</div>
 	<div class="ping_status">' . esc_html( $post->ping_status ) . '</div>
 	<div class="_status">' . esc_html( $post->post_status ) . '</div>
-	<div class="jj">' . mysql2date( 'd', $post->post_date, false ) . '</div>
-	<div class="mm">' . mysql2date( 'm', $post->post_date, false ) . '</div>
-	<div class="aa">' . mysql2date( 'Y', $post->post_date, false ) . '</div>
-	<div class="hh">' . mysql2date( 'H', $post->post_date, false ) . '</div>
-	<div class="mn">' . mysql2date( 'i', $post->post_date, false ) . '</div>
+	<div class="dd">' . mysql2date( __('m/d/Y'), $post->post_date, false ) . '</div>
+	<div class="tt">' . mysql2date( 'H:i', $post->post_date, false ) . '</div>
 	<div class="ss">' . mysql2date( 's', $post->post_date, false ) . '</div>
 	<div class="post_password">' . esc_html( $post->post_password ) . '</div>';
 
@@ -598,43 +595,27 @@
 
 	$time_adj = current_time('timestamp');
 	$post_date = ($for_post) ? $post->post_date : $comment->comment_date;
-	$jj = ($edit) ? mysql2date( 'd', $post_date, false ) : gmdate( 'd', $time_adj );
-	$mm = ($edit) ? mysql2date( 'm', $post_date, false ) : gmdate( 'm', $time_adj );
-	$aa = ($edit) ? mysql2date( 'Y', $post_date, false ) : gmdate( 'Y', $time_adj );
-	$hh = ($edit) ? mysql2date( 'H', $post_date, false ) : gmdate( 'H', $time_adj );
-	$mn = ($edit) ? mysql2date( 'i', $post_date, false ) : gmdate( 'i', $time_adj );
-	$ss = ($edit) ? mysql2date( 's', $post_date, false ) : gmdate( 's', $time_adj );
+	
+	$date_format = __('m/d/Y');
+	$dd = ($edit) ? mysql2date($date_format, $post_date, false) : gmdate($date_format, $time_adj);
+	$tt = ($edit) ? mysql2date('H:i', $post_date, false) : gmdate('H:i', $time_adj);
+	$ss = ($edit) ? mysql2date('s', $post_date, false) : gmdate('s', $time_adj);
+	
+	$cur_dd = gmdate($date_format, $time_adj);
+	$cur_tt = gmdate('H:i', $time_adj);
 
-	$cur_jj = gmdate( 'd', $time_adj );
-	$cur_mm = gmdate( 'm', $time_adj );
-	$cur_aa = gmdate( 'Y', $time_adj );
-	$cur_hh = gmdate( 'H', $time_adj );
-	$cur_mn = gmdate( 'i', $time_adj );
+	$date = '<input type="text" ' . ($multi ? '' : 'id="dd"') . ' name="dd" value="' . $dd . '" size="10" maxlength="10"' . $tab_index_attribute . ' autocomplete="off" class="datepicker" />';
+	$time = '<input type="text" ' . ($multi ? '' : 'id="tt"') . ' name="tt" value="' . $tt . '" size="10" maxlength="10"' . $tab_index_attribute . ' autocomplete="off" class="timepicker" />';
 
-	$month = "<select " . ( $multi ? '' : 'id="mm" ' ) . "name=\"mm\"$tab_index_attribute>\n";
-	for ( $i = 1; $i < 13; $i = $i +1 ) {
-		$month .= "\t\t\t" . '<option value="' . zeroise($i, 2) . '"';
-		if ( $i == $mm )
-			$month .= ' selected="selected"';
-		$month .= '>' . $wp_locale->get_month_abbrev( $wp_locale->get_month( $i ) ) . "</option>\n";
-	}
-	$month .= '</select>';
-
-	$day = '<input type="text" ' . ( $multi ? '' : 'id="jj" ' ) . 'name="jj" value="' . $jj . '" size="2" maxlength="2"' . $tab_index_attribute . ' autocomplete="off" />';
-	$year = '<input type="text" ' . ( $multi ? '' : 'id="aa" ' ) . 'name="aa" value="' . $aa . '" size="4" maxlength="4"' . $tab_index_attribute . ' autocomplete="off" />';
-	$hour = '<input type="text" ' . ( $multi ? '' : 'id="hh" ' ) . 'name="hh" value="' . $hh . '" size="2" maxlength="2"' . $tab_index_attribute . ' autocomplete="off" />';
-	$minute = '<input type="text" ' . ( $multi ? '' : 'id="mn" ' ) . 'name="mn" value="' . $mn . '" size="2" maxlength="2"' . $tab_index_attribute . ' autocomplete="off" />';
-
 	echo '<div class="timestamp-wrap">';
-	/* translators: 1: month input, 2: day input, 3: year input, 4: hour input, 5: minute input */
-	printf(__('%1$s%2$s, %3$s @ %4$s : %5$s'), $month, $day, $year, $hour, $minute);
+	printf(__('Date %s @ %s'), $date, $time);
 
 	echo '</div><input type="hidden" id="ss" name="ss" value="' . $ss . '" />';
 
 	if ( $multi ) return;
 
 	echo "\n\n";
-	foreach ( array('mm', 'jj', 'aa', 'hh', 'mn') as $timeunit ) {
+	foreach ( array('dd', 'tt') as $timeunit ) {
 		echo '<input type="hidden" id="hidden_' . $timeunit . '" name="hidden_' . $timeunit . '" value="' . $$timeunit . '" />' . "\n";
 		$cur_timeunit = 'cur_' . $timeunit;
 		echo '<input type="hidden" id="'. $cur_timeunit . '" name="'. $cur_timeunit . '" value="' . $$cur_timeunit . '" />' . "\n";
@@ -645,6 +626,14 @@
 <a href="#edit_timestamp" class="save-timestamp hide-if-no-js button"><?php _e('OK'); ?></a>
 <a href="#edit_timestamp" class="cancel-timestamp hide-if-no-js"><?php _e('Cancel'); ?></a>
 </p>
+
+<script type="text/javascript">
+<!--
+jQuery(document).ready( function() {
+	setupDateAndTimePickers(false);
+} );
+//-->
+</script>
 <?php
 }
 
Index: wp-admin/js/comment.dev.js
===================================================================
--- wp-admin/js/comment.dev.js	(revision 18444)
+++ wp-admin/js/comment.dev.js	(working copy)
@@ -11,21 +11,35 @@
 
 	$('.cancel-timestamp').click(function() {
 		$('#timestampdiv').slideUp("normal");
-		$('#mm').val($('#hidden_mm').val());
-		$('#jj').val($('#hidden_jj').val());
-		$('#aa').val($('#hidden_aa').val());
-		$('#hh').val($('#hidden_hh').val());
-		$('#mn').val($('#hidden_mn').val());
+		$('#dd').val($('#hidden_dd').val());
+		$('#tt').val($('#hidden_tt').val());
 		$('#timestamp').html(stamp);
 		$('.edit-timestamp').show();
 		return false;
 	});
 
 	$('.save-timestamp').click(function () { // crazyhorse - multiple ok cancels
-		var aa = $('#aa').val(), mm = $('#mm').val(), jj = $('#jj').val(), hh = $('#hh').val(), mn = $('#mn').val(),
-			newD = new Date( aa, mm - 1, jj, hh, mn );
+		var dateRE = new RegExp(commonL10n.date_regexp);
+		var dateCompOrder = commonL10n.date_components_order.split(',');
+		var timeRE = new RegExp(commonL10n.time_regexp);
+	
+		var dd = $('#dd').val(), tt = $('#tt').val();
+		
+		var dateREResult = dateRE.exec(dd);
+		var timeREResult = timeRE.exec(tt);
+		if (dateREResult == null || timeREResult == null)
+		{
+			$('.timestamp-wrap', '#timestampdiv').addClass('form-invalid');
+			return false;		
+		}
+	
+		var dateCompIndices = new Object();
+		for (var i = 0; i < dateCompOrder.length; i++)
+			dateCompIndices[dateCompOrder[i]] = i + 1;
+	
+		var newD = new Date(dateREResult[dateCompIndices.year], dateREResult[dateCompIndices.month] - 1, dateREResult[dateCompIndices.day], timeREResult[1], timeREResult[2]);	
 
-		if ( newD.getFullYear() != aa || (1 + newD.getMonth()) != mm || newD.getDate() != jj || newD.getMinutes() != mn ) {
+		if ( newD.getFullYear() != dateREResult[dateCompIndices.year] || (1 + newD.getMonth()) != dateREResult[dateCompIndices.month] || newD.getDate() != dateREResult[dateCompIndices.day] || newD.getMinutes() != timeREResult[2] ) {
 			$('.timestamp-wrap', '#timestampdiv').addClass('form-invalid');
 			return false;
 		} else {
@@ -34,14 +48,7 @@
 
 		$('#timestampdiv').slideUp("normal");
 		$('.edit-timestamp').show();
-		$('#timestamp').html(
-			commentL10n.submittedOn + ' <b>' +
-			$( '#mm option[value="' + mm + '"]' ).text() + ' ' +
-			jj + ', ' +
-			aa + ' @ ' +
-			hh + ':' +
-			mn + '</b> '
-		);
+		$('#timestamp').html( commentL10n.submittedOn + ' <b>' + $( '#dd' ).val() + ' @ ' + $( '#tt' ).val() + '</b> ' );
 		return false;
 	});
 });
Index: wp-admin/js/post.dev.js
===================================================================
--- wp-admin/js/post.dev.js	(revision 18444)
+++ wp-admin/js/post.dev.js	(working copy)
@@ -369,14 +369,34 @@
 
 		function updateText() {
 			var attemptedDate, originalDate, currentDate, publishOn, postStatus = $('#post_status'),
-				optPublish = $('option[value="publish"]', postStatus), aa = $('#aa').val(),
-				mm = $('#mm').val(), jj = $('#jj').val(), hh = $('#hh').val(), mn = $('#mn').val();
+				optPublish = $('option[value="publish"]', postStatus), dd = $('#dd').val(), tt = $('#tt').val();
 
-			attemptedDate = new Date( aa, mm - 1, jj, hh, mn );
-			originalDate = new Date( $('#hidden_aa').val(), $('#hidden_mm').val() -1, $('#hidden_jj').val(), $('#hidden_hh').val(), $('#hidden_mn').val() );
-			currentDate = new Date( $('#cur_aa').val(), $('#cur_mm').val() -1, $('#cur_jj').val(), $('#cur_hh').val(), $('#cur_mn').val() );
+			var dateRE = new RegExp(commonL10n.date_regexp);
+			var dateCompOrder = commonL10n.date_components_order.split(',');
+			var timeRE = new RegExp(commonL10n.time_regexp);
+			
+			var dateREResult = dateRE.exec(dd);
+			var hiddenDateREResult = dateRE.exec( $('#hidden_dd').val() );
+			var curDateREResult = dateRE.exec( $('#cur_dd').val() );
+			var timeREResult = timeRE.exec(tt);
+			var hiddenTimeREResult = timeRE.exec( $('#hidden_tt').val() );
+			var curTimeREResult = timeRE.exec( $('#cur_tt').val() );
+			if (dateREResult == null || hiddenDateREResult == null || curDateREResult == null
+					|| timeREResult == null || hiddenTimeREResult == null || curTimeREResult == null)
+			{
+				$('.timestamp-wrap', '#timestampdiv').addClass('form-invalid');
+				return false;
+			}
 
-			if ( attemptedDate.getFullYear() != aa || (1 + attemptedDate.getMonth()) != mm || attemptedDate.getDate() != jj || attemptedDate.getMinutes() != mn ) {
+			var dateCompIndices = new Object();
+			for (var i = 0; i < dateCompOrder.length; i++)
+				dateCompIndices[dateCompOrder[i]] = i + 1;
+
+			attemptedDate = new Date( dateREResult[dateCompIndices.year], dateREResult[dateCompIndices.month] - 1, dateREResult[dateCompIndices.day], timeREResult[1], timeREResult[2] );
+			originalDate = new Date( hiddenDateREResult[dateCompIndices.year], hiddenDateREResult[dateCompIndices.month] - 1, hiddenDateREResult[dateCompIndices.day], hiddenTimeREResult[1], hiddenTimeREResult[2] );
+			currentDate = new Date( curDateREResult[dateCompIndices.year], curDateREResult[dateCompIndices.month] - 1, curDateREResult[dateCompIndices.day], curTimeREResult[1], curTimeREResult[2] );
+
+			if ( attemptedDate.getFullYear() != dateREResult[dateCompIndices.year] || (1 + attemptedDate.getMonth()) != dateREResult[dateCompIndices.month] || attemptedDate.getDate() != dateREResult[dateCompIndices.day] || attemptedDate.getMinutes() != timeREResult[2] ) {
 				$('.timestamp-wrap', '#timestampdiv').addClass('form-invalid');
 				return false;
 			} else {
@@ -393,17 +413,10 @@
 				publishOn = postL10n.publishOnPast;
 				$('#publish').val( postL10n.update );
 			}
-			if ( originalDate.toUTCString() == attemptedDate.toUTCString() ) { //hack
+			if ( originalDate.getTime() == attemptedDate.getTime() ) {
 				$('#timestamp').html(stamp);
 			} else {
-				$('#timestamp').html(
-					publishOn + ' <b>' +
-					$('option[value="' + $('#mm').val() + '"]', '#mm').text() + ' ' +
-					jj + ', ' +
-					aa + ' @ ' +
-					hh + ':' +
-					mn + '</b> '
-				);
+				$('#timestamp').html(publishOn + ' <b>' + $('#dd').val() + ' @ ' + $('#tt').val() + '</b>' );
 			}
 
 			if ( $('input:radio:checked', '#post-visibility-select').val() == 'private' ) {
@@ -496,11 +509,8 @@
 
 		$('.cancel-timestamp', '#timestampdiv').click(function() {
 			$('#timestampdiv').slideUp('fast');
-			$('#mm').val($('#hidden_mm').val());
-			$('#jj').val($('#hidden_jj').val());
-			$('#aa').val($('#hidden_aa').val());
-			$('#hh').val($('#hidden_hh').val());
-			$('#mn').val($('#hidden_mn').val());
+			$('#dd').val($('#hidden_dd').val());
+			$('#tt').val($('#hidden_tt').val());
 			$('#timestampdiv').siblings('a.edit-timestamp').show();
 			updateText();
 			return false;
Index: wp-admin/js/common.dev.js
===================================================================
--- wp-admin/js/common.dev.js	(revision 18444)
+++ wp-admin/js/common.dev.js	(working copy)
@@ -368,3 +368,26 @@
 });
 
 })(jQuery);
+
+function setupDateAndTimePickers(useContext, context) {
+	var ctx = null;
+	if (useContext === true)
+		ctx = jQuery(context);
+
+	jQuery('.datepicker', ctx).datepicker( {
+		dateFormat: commonL10n.datePicker_dateFormat,
+		firstDay: commonL10n.datePicker_firstDay
+	} );
+	
+	jQuery('.timepicker', ctx).timepicker( {
+		hourText: commonL10n.timePicker_hourText,
+		minuteText: commonL10n.timePicker_minuteText,
+		showPeriodLabels: false,
+		minutes: {
+			starts: 0,
+			ends: 0,
+			interval: 1
+		},
+		rows: 6
+	} );
+}
Index: wp-admin/js/inline-edit-post.dev.js
===================================================================
--- wp-admin/js/inline-edit-post.dev.js	(revision 18444)
+++ wp-admin/js/inline-edit-post.dev.js	(working copy)
@@ -129,7 +129,7 @@
 		if ( typeof(id) == 'object' )
 			id = t.getId(id);
 
-		fields = ['post_title', 'post_name', 'post_author', '_status', 'jj', 'mm', 'aa', 'hh', 'mn', 'ss', 'post_password'];
+		fields = ['post_title', 'post_name', 'post_author', '_status', 'dd', 'tt', 'ss', 'post_password'];
 		if ( t.type == 'page' )
 			fields.push('post_parent', 'menu_order', 'page_template');
 
@@ -215,6 +215,8 @@
 		$(editRow).attr('id', 'edit-'+id).addClass('inline-editor').show();
 		$('.ptitle', editRow).focus();
 
+		setupDateAndTimePickers(true, editRow);
+
 		return false;
 	},
 
Index: wp-admin/admin-header.php
===================================================================
--- wp-admin/admin-header.php	(revision 18444)
+++ wp-admin/admin-header.php	(working copy)
@@ -41,9 +41,16 @@
 wp_admin_css();
 wp_admin_css( 'colors' );
 wp_admin_css( 'ie' );
+wp_admin_css( 'jquery-ui-core' );
+wp_admin_css( 'jquery-ui-theme' );
+wp_admin_css( 'jquery-ui-timepicker' );
+wp_admin_css( 'jquery-ui-datepicker' );
 if ( is_multisite() )
 	wp_admin_css( 'ms' );
 wp_enqueue_script('utils');
+wp_enqueue_script( 'jquery-ui-timepicker' );
+wp_enqueue_script( 'jquery-ui-datepicker' );
+wp_enqueue_script( 'jquery-ui-datepicker-i18n' );
 
 $admin_body_class = preg_replace('/[^a-z0-9_-]+/i', '-', $hook_suffix);
 ?>
Index: wp-admin/css/wp-admin.dev.css
===================================================================
--- wp-admin/css/wp-admin.dev.css	(revision 18444)
+++ wp-admin/css/wp-admin.dev.css	(working copy)
@@ -2104,13 +2104,16 @@
 	float: left;
 }
 
-.inline-edit-row fieldset input[name=jj],
-.inline-edit-row fieldset input[name=hh],
-.inline-edit-row fieldset input[name=mn] {
+.inline-edit-row fieldset input[name=dd] {
 	font-size: 12px;
-	width: 2.1em;
+	width: 10.1em;
 }
 
+.inline-edit-row fieldset input[name=tt] {
+	font-size: 12px;
+	width: 5.1em;
+}
+
 .inline-edit-row fieldset input[name=aa] {
 	font-size: 12px;
 	width: 3.5em;
@@ -2682,12 +2685,18 @@
 	vertical-align: top;
 }
 
-#jj, #hh, #mn {
-	width: 2em;
+#dd {
+	width: 10em;
 	padding: 1px;
 	font-size: 12px;
 }
 
+#tt {
+	width: 5em;
+	padding: 1px;
+	font-size: 12px;
+}
+
 #aa {
 	width: 3.4em;
 	padding: 1px;
