在Drupal 7中以编程方式设置日期字段:日期,日期(ISO格式)和日期(Unix时间戳记)


11

使用Form APIhook_form_alter(),如何使用有效的Unix时间戳手动设置(强制)Drupal 7的每种日期字段类型的值?

最终提交表单时,field_date类型始终为空数组。以下是我正在处理的损坏代码。

hook_form_alter(&$form, &$form_state, $form_id) {

    // http://drupal.org/node/1455576 - Date
    $form['field_date'][LANGUAGE_NONE][0]['value'] = time();

    // http://drupal.org/node/1455576 - Date (ISO Format)
    $form['field_date_iso_format'][LANGUAGE_NONE][0]['value'] = time();

    // http://drupal.org/node/1455576 - Date (Unix Timestamp)
    $form['field_date_unix_timestamp'][LANGUAGE_NONE][0]['value'] =time();
}

我应该提到将字段小部件设置为文本,其格式为“ Ymd H:i:s”

我也尝试过date('Y-m-d H:i:s', time())代替time()

示例dpm()输出。

dpm()示例输出

我还应注意,作为一种解决方法,如果在hook_node_presave()中对其进行修改,则可以设置该字段。为此,我设置了$node->field_date['und'][0]['value'] = date('Y-m-d H:i:s', $my_unix_timestamp);我仍然想了解如何使用hook_form_alter来做到这一点。


该代码以何种方式被破坏?
Countzero 2012年

date('Ym-d',strtotime('31 May 2011'))和time()始终为空。我开始认为我对日期使用了错误的数组。$ form ['date_field'] ['und'] [0] ['value']可能不正确?回到文档。
Citricguy 2012年

最终提交表单时,field_date类型始终为空数组。
Citricguy 2012年

您尝试设定$form['field_date'][LANGUAGE_NONE][0]['#default_value']['value']吗?
Countzero 2012年

您是否可以尝试删除任何自定义代码并从ui提交表单以检查从字段中本地保存的格式?
WestieUK,2012年

Answers:


14

这是一个适合我的网站时区代码:

 $node->field_date[LANGUAGE_NONE][0] = array(
    'value' => format_date(strtotime('now'), 'custom', 'Y-m-d H:i:s', 'UTC'),
    'timezone' => 'UTC',  
    'timezone_db' => 'UTC',
  );

1
5年后,这仍然是一个很好的答案。虽然使用起来有意义'timezone' => variable_get('date_default_timezone', 'UTC'),吗?
marcvangend

6

每个日期字段类型都期望使用不同格式的时间戳(基于其在数据库中的存储方式):

// For datetime
$node->field_datetest[$node->language][0]['value'] = "2011-05-25 10:35:58";

// For date
$node->field_datetest[$node->language][0]['value'] = "2011-05-25T10:35:58";

// For datestamp
$node->field_datetest[$node->language][0]['value'] = strtotime("2011-05-25 10:35:58");

请注意,您无需指定完整日期;对于日期时间和日期,您可以只用零填充,例如“ 2011-05-00 00:00:00”(日期时间),“ 2011-00-00T00:00:00”(日期)等。对于日期戳,您可以做例如strtotime(“ 2011-05-25”)。

重要说明:还请注意,虽然您指定的确切值将存储在数据库中,但根据时区设置,站点上显示的实际时间可能会有所不同。创建新的datetime / date / datestamp字段时,可以在五种不同的时区处理方法之间进行选择。默认值是“站点的时区”:

在字段中输入数据时,假定输入的数据在站点的时区中。数据保存到数据库后,将转换为UTC。但是,如果像上面的示例一样以编程方式设置日期字段,则不会进行任何转换,因此请确保您考虑了该字段的时区设置。换句话说,如果您使用“站点的时区”,请确保时间以UTC为单位。

该信息是从fooninja博客上标有“ 日期”字段(日期时间,日期,日期的部分引用的。

这也是在Drupal 7中创建程序化节点的重要常规资源。


您需要在值键周围加上引号
主播

谢谢主人!更新以反映您的改进。
MD3 2013年

5

这对我有用。

$node->field_date[LANGUAGE_NONE][0] = array(
      'value' => date('Y-m-d H:i:s', strtotime('now')),
      'timezone' => 'UTC',
      'timezone_db' => 'UTC',
);

2

time()值在此级别上不起作用。

您必须使用类似:

$mydate = date('Y-m-d', strtotime('31 May 2011'));

这对我适用于hook_node_presave,但不适用于hook_form_alter。
Citricguy 2012年

您是否尝试$form['field_date'][LANGUAGE_NONE][0]['#default_value']['value']过如上所述设置?
Countzero 2012年

发现它已在$ node-> field_date [LANGUAGE_NONE] [0]中保存了节点
Citricguy 2012年

无法与hook_form_alter一起使用...有什么帮助吗?
Rajesh Vishwakarma

2

对于Date东西,我们可以编写一个js来获取当前日期...

jQuery(document).ready(function() {

    var fullDate = new Date()
    var HR_fullDate = fullDate.toDateString().toString().substring(4,15);
    jQuery('strong.date').contents().replaceWith(HR_fullDate);

});

1

如果您使用字段类型,请Date (ISO format)使用:

$node->field_datetest[$node->language][0][value] = "2011-05-25T10:35";

1

尝试这个:

$now = date_now('UTC');
$now = date_format($now, "Y-m-d H:i:s");

1

对于那些处理$ form_state和弹出窗口小部件的人:

// The date format in this sample is dd/mm/yyyy
$form_state['values']['field_my_date_field']['und'][0]['value']['date'] = '14/05/2014';

1

要为日期字段设置值,请遵循以下代码。

使用hook_form_alter

$ form [“ field_date”] [“ und”] [0] ['#default_value'] ['value'] = $ new_date;

使用hook_node_submit或hook_node_presave(将值保存到数据库)

 function MY_MODULE_node_presave($node) 
  {
      $node->field_date['und'][0]['value'] =  '2014-09-23 00:00:00';
  }

或者,如果您需要将一个自定义字段(在hook_form_alter中定义)的值保存到另一个,请参见以下代码。

function MY_MODULE_node_submit($node, $form, &$form_state) {
  if($node->type == 'my_node_type') {
    $test_date =  $form['test_date ']['#value'];
    //Ensure that $test_date format is '2014-09-23 00:00:00'
    $node->field_date['und'][0]['value'] =  $test_date ;
   }
}

0

接受的答案是给我一个PDO异常。只有一个简单的time()调用可用于“ datestamp”字段!

        $entity->field_upload_time["und"][0]["value"] = time();

-1

使用time()并正常工作....

$ fc_item_wrapper-> field_data_pedido-> set(time());

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.