@@ -2500,6 +2500,49 @@ PHPAPI bool php_date_initialize(php_date_obj *dateobj, const char *time_str, siz
2500
2500
return 1 ;
2501
2501
} /* }}} */
2502
2502
2503
+ PHPAPI void php_date_initialize_from_ts_long (php_date_obj * dateobj , zend_long sec , int usec ) /* {{{ */
2504
+ {
2505
+ dateobj -> time = timelib_time_ctor ();
2506
+ dateobj -> time -> zone_type = TIMELIB_ZONETYPE_OFFSET ;
2507
+
2508
+ timelib_unixtime2gmt (dateobj -> time , (timelib_sll )sec );
2509
+ timelib_update_ts (dateobj -> time , NULL );
2510
+ php_date_set_time_fraction (dateobj -> time , usec );
2511
+ } /* }}} */
2512
+
2513
+ PHPAPI bool php_date_initialize_from_ts_double (php_date_obj * dateobj , double ts ) /* {{{ */
2514
+ {
2515
+ double sec_dval = trunc (ts );
2516
+ zend_long sec ;
2517
+ int usec ;
2518
+
2519
+ if (UNEXPECTED (isnan (sec_dval )
2520
+ || sec_dval >= (double )TIMELIB_LONG_MAX
2521
+ || sec_dval < (double )TIMELIB_LONG_MIN
2522
+ )) {
2523
+ zend_throw_error (
2524
+ date_ce_date_range_error ,
2525
+ "Seconds must be a finite number between " TIMELIB_LONG_FMT " and " TIMELIB_LONG_FMT ", %g given" ,
2526
+ TIMELIB_LONG_MIN ,
2527
+ TIMELIB_LONG_MAX ,
2528
+ sec_dval
2529
+ );
2530
+ return false;
2531
+ }
2532
+
2533
+ sec = (zend_long )sec_dval ;
2534
+ usec = (int )(fmod (ts , 1 ) * 1000000 );
2535
+
2536
+ if (UNEXPECTED (usec < 0 )) {
2537
+ sec = sec - 1 ;
2538
+ usec = 1000000 + usec ;
2539
+ }
2540
+
2541
+ php_date_initialize_from_ts_long (dateobj , sec , usec );
2542
+
2543
+ return true;
2544
+ } /* }}} */
2545
+
2503
2546
/* {{{ Returns new DateTime object */
2504
2547
PHP_FUNCTION (date_create )
2505
2548
{
@@ -2564,7 +2607,7 @@ PHP_FUNCTION(date_create_from_format)
2564
2607
}
2565
2608
/* }}} */
2566
2609
2567
- /* {{{ Returns new DateTime object formatted according to the specified format */
2610
+ /* {{{ Returns new DateTimeImmutable object formatted according to the specified format */
2568
2611
PHP_FUNCTION (date_create_immutable_from_format )
2569
2612
{
2570
2613
zval * timezone_object = NULL ;
@@ -2662,6 +2705,39 @@ PHP_METHOD(DateTime, createFromInterface)
2662
2705
}
2663
2706
/* }}} */
2664
2707
2708
+ /* {{{ Creates new DateTime object from given unix timetamp */
2709
+ PHP_METHOD (DateTime , createFromTimestamp )
2710
+ {
2711
+ zval * value ;
2712
+ zval new_object ;
2713
+ php_date_obj * new_dateobj ;
2714
+
2715
+ ZEND_PARSE_PARAMETERS_START (1 , 1 )
2716
+ Z_PARAM_NUMBER (value )
2717
+ ZEND_PARSE_PARAMETERS_END ();
2718
+
2719
+ php_date_instantiate (execute_data -> This .value .ce ? execute_data -> This .value .ce : date_ce_date , & new_object );
2720
+ new_dateobj = Z_PHPDATE_P (& new_object );
2721
+
2722
+ switch (Z_TYPE_P (value )) {
2723
+ case IS_LONG :
2724
+ php_date_initialize_from_ts_long (new_dateobj , Z_LVAL_P (value ), 0 );
2725
+ break ;
2726
+
2727
+ case IS_DOUBLE :
2728
+ if (!php_date_initialize_from_ts_double (new_dateobj , Z_DVAL_P (value ))) {
2729
+ zval_ptr_dtor (& new_object );
2730
+ RETURN_THROWS ();
2731
+ }
2732
+ break ;
2733
+
2734
+ EMPTY_SWITCH_DEFAULT_CASE ();
2735
+ }
2736
+
2737
+ RETURN_OBJ (Z_OBJ (new_object ));
2738
+ }
2739
+ /* }}} */
2740
+
2665
2741
/* {{{ Creates new DateTimeImmutable object from an existing mutable DateTime object. */
2666
2742
PHP_METHOD (DateTimeImmutable , createFromMutable )
2667
2743
{
@@ -2704,6 +2780,39 @@ PHP_METHOD(DateTimeImmutable, createFromInterface)
2704
2780
}
2705
2781
/* }}} */
2706
2782
2783
+ /* {{{ Creates new DateTimeImmutable object from given unix timestamp */
2784
+ PHP_METHOD (DateTimeImmutable , createFromTimestamp )
2785
+ {
2786
+ zval * value ;
2787
+ zval new_object ;
2788
+ php_date_obj * new_dateobj ;
2789
+
2790
+ ZEND_PARSE_PARAMETERS_START (1 , 1 )
2791
+ Z_PARAM_NUMBER (value )
2792
+ ZEND_PARSE_PARAMETERS_END ();
2793
+
2794
+ php_date_instantiate (execute_data -> This .value .ce ? execute_data -> This .value .ce : date_ce_immutable , & new_object );
2795
+ new_dateobj = Z_PHPDATE_P (& new_object );
2796
+
2797
+ switch (Z_TYPE_P (value )) {
2798
+ case IS_LONG :
2799
+ php_date_initialize_from_ts_long (new_dateobj , Z_LVAL_P (value ), 0 );
2800
+ break ;
2801
+
2802
+ case IS_DOUBLE :
2803
+ if (!php_date_initialize_from_ts_double (new_dateobj , Z_DVAL_P (value ))) {
2804
+ zval_ptr_dtor (& new_object );
2805
+ RETURN_THROWS ();
2806
+ }
2807
+ break ;
2808
+
2809
+ EMPTY_SWITCH_DEFAULT_CASE ();
2810
+ }
2811
+
2812
+ RETURN_OBJ (Z_OBJ (new_object ));
2813
+ }
2814
+ /* }}} */
2815
+
2707
2816
static bool php_date_initialize_from_hash (php_date_obj * * dateobj , HashTable * myht )
2708
2817
{
2709
2818
zval * z_date ;
0 commit comments