5

I'm in the process of porting one of my contrib themes to Drupal 8. For custom date formats on nodes, I have something like this in a node_preprocess function in the theme's template.php file in the Drupal 7 version:

$vars['thedate'] = format_date($node->created, "custom", "j");
$vars['themonth'] = format_date($node->created, "custom", "M");
$vars['theyear'] = format_date($node->created, "custom", "Y");

I render it with the following code.

  <?php print $thedate; ?> / <?php print $themonth; ?> / <?php print $theyear; ?>

In my Drupal 8 port, I've tried a similar approach in the theme's .theme file and then try to render them in node.html.twig as {{{ thedate }} / {{ themonth }} / {{ theyear }}}, but I'm getting a nasty error.

Twig_Error_Runtime: An exception has been thrown during the rendering of a template ("The timestamp must be numeric.") in themes/mytheme/templates/page.html.twig at line 210. in Twig_Template->displayWithErrorHandling() (line 279 of /site/core/vendor/twig/twig/lib/Twig/Template.php).

I looked to Twig date formats, and it seems you should simply attach a variable, such as {{ display_submitted |date("m/d/Y") }}. I tried that without a preprocess function but what outputs is 12/31/1969, which is not the date the node was created so I'm a bit lost here.

1
  • 2
    Note that this has nothing to do with Twig (apart from the unhelpful error handling), but I'm leaving the question as it is, as someone else might search for this. I'll expect we'll see a few similar ones, this isn't obvious if you're coming from 7.x.
    – Berdir
    Nov 26, 2013 at 9:07

3 Answers 3

7

$node->created is a FieldItemList object.

You need to use either one of these.

$vars['thedate'] = format_date($node->created->value, "custom", "j");
$vars['thedate'] = format_date($node->getCreatedTime(), "custom", "j");

All node base fields (and most other entity types, some are still being worked on) have methods now, that are defined in NodeInterface.

4
  • 1
    Changed TypedData to FieldItemList and made the documentation link a bit more specific.
    – Berdir
    Nov 26, 2013 at 7:56
  • Very interesting! Both of those work fine so thanks for that. I'm one of those who will be really struggling to wrap my arms around Drupal 8 (self taught, no CS degree) so I'm trying to start early to unravel some of this. The jury is still out whether I'll be up tot he task or not so I appreciate the help. Nov 26, 2013 at 14:03
  • Just curious, for comments, if I use $vars['created'] = format_date($comment->getCreatedTime(), "custom", "m / j / y");, that does not work, I need to use $vars['created'] = format_date($comment->created->value, "custom", "m / j / y"); so it seems inconsistent... Nov 27, 2013 at 15:02
  • Comment::getCreatedTime() will work eventually, see drupal.org/node/2028025 Nov 28, 2013 at 5:36
14

Here is an approach that uses just Twig (no preprocess functions needed):

<p>{{ node.createdtime | date("d F Y") }}</p>
1
  • Excellent, the more I have been using Twig, the more I discover that preprocess functions are needed far less. Mar 16, 2016 at 17:02
1

For people who need a little more help understanding this, add the following to YOURTHEMENAME.theme file:

/**
 * Implements template_preprocess_comment()
 */
function YOURTHEMENAME_preprocess_comment(&$variables) {
  $comment = $variables['elements']['#comment'];
  $variables['YOUR_DATE_NAME'] = format_date($comment->created->value, "custom", "m / j / y");
}

Then in your theme, update the twig template (such as templates/comment.html.twig) to use the variable like so: {{ YOUR_DATE_NAME }}

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.