public DateFormatter::formatDiff($from, $to, $options = array())
Formats a time interval between two timestamps.
Parameters
int $from: A UNIX timestamp, defining the from date and time.
int $to: A UNIX timestamp, defining the to date and time.
array $options: (optional) An associative array with additional options. The following keys can be used:
- granularity: An integer value that signals how many different units to display in the string. Defaults to 2.
- langcode: The language code for the language used to format the date. Defaults to NULL, which results in the user interface language for the page being used.
- strict: A Boolean value indicating whether or not the $from timestamp can be after the $to timestamp. If TRUE (default) and $from is after $to, the result string will be "0 seconds". If FALSE and $from is after $to, the result string will be the formatted time difference.
- return_as_object: A Boolean value whether to return a FormattedDateDiff object.
Return value
string|\Drupal\Core\Datetime\FormattedDateDiff A translated string representation of the interval. This interval is always positive.
Overrides DateFormatterInterface::formatDiff
See also
\Drupal\Core\Datetime\DateFormatterInterface::formatInterval()
\Drupal\Core\Datetime\DateFormatterInterface::formatTimeDiffSince()
\Drupal\Core\Datetime\DateFormatterInterface::formatTimeDiffUntil()
File
- core/lib/Drupal/Core/Datetime/DateFormatter.php, line 198
Class
- DateFormatter
- Provides a service to handle various date related functionality.
Namespace
Drupal\Core\Datetime
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | public function formatDiff( $from , $to , $options = array ()) { $options += array ( 'granularity' => 2, 'langcode' => NULL, 'strict' => TRUE, 'return_as_object' => FALSE, ); if ( $options [ 'strict' ] && $from > $to ) { $string = $this ->t( '0 seconds' ); if ( $options [ 'return_as_object' ]) { return new FormattedDateDiff( $string , 0); } return $string ; } $date_time_from = new \DateTime(); $date_time_from ->setTimestamp( $from ); $date_time_to = new \DateTime(); $date_time_to ->setTimestamp( $to ); $interval = $date_time_to ->diff( $date_time_from ); $granularity = $options [ 'granularity' ]; $output = '' ; // We loop over the keys provided by \DateInterval explicitly. Since we // don't take the "invert" property into account, the resulting output value // will always be positive. $max_age = 1e99; foreach ( array ( 'y' , 'm' , 'd' , 'h' , 'i' , 's' ) as $value ) { if ( $interval -> $value > 0) { // Switch over the keys to call formatPlural() explicitly with literal // strings for all different possibilities. switch ( $value ) { case 'y' : $interval_output = $this ->formatPlural( $interval ->y, '1 year' , '@count years' , array (), array ( 'langcode' => $options [ 'langcode' ])); $max_age = min( $max_age , 365 * 86400); break ; case 'm' : $interval_output = $this ->formatPlural( $interval ->m, '1 month' , '@count months' , array (), array ( 'langcode' => $options [ 'langcode' ])); $max_age = min( $max_age , 30 * 86400); break ; case 'd' : // \DateInterval doesn't support weeks, so we need to calculate them // ourselves. $interval_output = '' ; $days = $interval ->d; $weeks = floor ( $days / 7); if ( $weeks ) { $interval_output .= $this ->formatPlural( $weeks , '1 week' , '@count weeks' , array (), array ( 'langcode' => $options [ 'langcode' ])); $days -= $weeks * 7; $granularity --; $max_age = min( $max_age , 7 * 86400); } if ((! $output || $weeks > 0) && $granularity > 0 && $days > 0) { $interval_output .= ( $interval_output ? ' ' : '' ) . $this ->formatPlural( $days , '1 day' , '@count days' , array (), array ( 'langcode' => $options [ 'langcode' ])); $max_age = min( $max_age , 86400); } else { // If we did not output days, set the granularity to 0 so that we // will not output hours and get things like "1 week 1 hour". $granularity = 0; } break ; case 'h' : $interval_output = $this ->formatPlural( $interval ->h, '1 hour' , '@count hours' , array (), array ( 'langcode' => $options [ 'langcode' ])); $max_age = min( $max_age , 3600); break ; case 'i' : $interval_output = $this ->formatPlural( $interval ->i, '1 minute' , '@count minutes' , array (), array ( 'langcode' => $options [ 'langcode' ])); $max_age = min( $max_age , 60); break ; case 's' : $interval_output = $this ->formatPlural( $interval ->s, '1 second' , '@count seconds' , array (), array ( 'langcode' => $options [ 'langcode' ])); $max_age = min( $max_age , 1); break ; } $output .= ( $output && $interval_output ? ' ' : '' ) . $interval_output ; $granularity --; } elseif ( $output ) { // Break if there was previous output but not any output at this level, // to avoid skipping levels and getting output like "1 year 1 second". break ; } if ( $granularity <= 0) { break ; } } if ( empty ( $output )) { $output = $this ->t( '0 seconds' ); $max_age = 0; } if ( $options [ 'return_as_object' ]) { return new FormattedDateDiff( $output , $max_age ); } return $output ; } |
Please login to continue.