2013-05-22 71 views
10

[EDIT]: Tôi đoán mọi người có vấn đề để hiểu chính xác ý tôi, vì vậy tôi đã viết lại hoàn toàn những lời giải thích của mình.Chuyển đổi định dạng ngày PHP sang định dạng ngày tháng DateBox của jQueryUI

Tôi làm việc trên một dự án mà người dùng có thể xác định định dạng ngày được sử dụng trong toàn bộ trang web. Nó sử dụng chuẩn định dạng ngày tháng PHP. Ví dụ: "year-month-day" được đặt bởi "Y-m-d".

Chuẩn PHP sử dụng ký hiệu một ký tự đơn lẻ như Y, m, d, F, j để mô tả định dạng ngày. Như đã thấy trong tài liệu: http://www.php.net/manual/fr/function.date.php

Đôi khi người dùng có thể chọn ngày nhờ vào một DatePicker jQueryUI. Thành phần này mô tả định dạng ngày của mình với mã những từ như yy, y, mm, dd, D, ... http://api.jqueryui.com/datepicker/#utility-formatDate

Tôi muốn hiển thị ngày tháng theo định dạng tương tự cho cả PHP và datepicker. Tôi có nghĩa là PHP sẽ xuất ngày theo định dạng do người dùng đặt, VÀ Datepicker sẽ hiển thị ngày đã chọn trong cùng định dạng.

Cho rằng:

  1. Định dạng ngày được thiết được mô tả "PHP phong cách"
  2. tôi có thể không biết một tiên nghiệm mà định dạng đã được thiết lập bởi người dùng

/! \ Đây không phải là vấn đề về cách đọc/phân tích/hiển thị ngày từ định dạng đã biết.

Thật không may, mô tả định dạng ngày Javascript không giống như trong PHP. Ví dụ, những 2 định dạng ngày là tương đương nhưng được mô tả khác nhau trong PHP và Javascript:

  1. PHP: Ymd (thiết lập bởi người sử dụng)
  2. Javascript: yy-mm-dd

Như bạn có thể thấy, tôi không thể chỉ định cấu hình datepicker với định dạng ngày tháng PHP, bởi vì nó sẽ bị hiểu lầm hoặc không được công nhận.

Một người nào đó (trong câu trả lời bên dưới) đã đề nghị tạo "công cụ chuyển đổi định dạng ngày tháng" của riêng tôi, phù hợp với mỗi biểu tượng PHP tương đương với mô tả định dạng ngày tháng JS. Giống như:

  • Y => yy
  • m => mm
  • d => dd
  • y => y
  • z => o
  • ...

Và sau đó thay thế mỗi biểu tượng PHP bằng ký hiệu JS. Và vì vậy "d/m/Y" sẽ được dịch thành "dd/mm/yy", một cách kỳ diệu.

Nhưng có lẽ ai đó biết cách thích hợp khác để làm cho jQueryUI Datepicker hiểu chuẩn định dạng ngày tháng PHP?

EDIT: Tôi đã viết hướng dẫn giải thích cả vấn đề và giải pháp. Để đọc thêm: http://tristan-jahier.fr/blog/2013/08/convertir-un-format-de-date-php-en-format-de-date-jqueryui-datepicker

+0

Không gửi định dạng ngày tháng ngoài PHP - luôn gửi định dạng cố định đã biết, để Javascript sẽ biết những gì mong đợi. Đừng mong đợi để có thể "xử lý tự động bất kỳ định dạng ngày nào", bởi vì về cơ bản là không thể có được quyền (do sự mơ hồ giữa các định dạng thường được sử dụng khác nhau). Toàn bộ điểm sử dụng bộ chọn ngày javascript là mã của bạn không bao giờ cần phải xử lý các ngày theo bất kỳ định dạng nào; bạn là lập trình viên nên có toàn quyền kiểm soát định dạng, vì vậy chỉ cần chọn một chương trình tốt ('yyyy-mm-dd' nói chung là tốt nhất) và gắn bó với nó. – Spudley

+0

Tôi hiểu suy nghĩ của bạn. Nhưng đây không phải là vấn đề của tôi. Trong thực tế, tôi muốn người dùng thấy ngày được hiển thị bởi Datepicker trong cùng một định dạng như được hiển thị bởi: 'echo $ date-> format (" any_format "); ' –

+0

vlttp: đây là một thứ được gửi tôi điên tất cả các lần. Mỗi ngôn ngữ khác tôi đã sử dụng trong 20 năm qua sử dụng đơn char cho chữ số duy nhất và char đôi cho chữ số kép với đệm cuối cùng với số không. Tại sao địa ngục PHP-là gần như hoàn hảo trong tất cả mọi thứ khác- phải được rất khác nhau trong này? Và, trong một khu vực (Dates) đã được khá hỗn loạn của chính nó !! – motoDrizzt

Trả lời

29

Tôi đã chọn phương pháp tàn bạo: chuyển đổi biểu tượng theo biểu tượng định dạng ngày. Tôi đã tạo đoạn mã 'không-để-giả'.

/* 
 * Matches each symbol of PHP date format standard 
 * with jQuery equivalent codeword 
* @author Tristan Jahier 
 */ 
function dateformat_PHP_to_jQueryUI($php_format) 
{ 
    $SYMBOLS_MATCHING = array(
        // Day 
        'd' => 'dd', 
        'D' => 'D', 
        'j' => 'd', 
        'l' => 'DD', 
        'N' => '', 
        'S' => '', 
        'w' => '', 
        'z' => 'o', 
        // Week 
        'W' => '', 
        // Month 
        'F' => 'MM', 
        'm' => 'mm', 
        'M' => 'M', 
        'n' => 'm', 
        't' => '', 
        // Year 
        'L' => '', 
        'o' => '', 
        'Y' => 'yy', 
        'y' => 'y', 
        // Time 
        'a' => '', 
        'A' => '', 
        'B' => '', 
        'g' => '', 
        'G' => '', 
        'h' => '', 
        'H' => '', 
        'i' => '', 
        's' => '', 
        'u' => '' 
    ); 
    $jqueryui_format = ""; 
    $escaping = false; 
    for($i = 0; $i < strlen($php_format); $i++) 
    { 
        $char = $php_format[$i]; 
        if($char === '\\') // PHP date format escaping character 
        { 
            $i++; 
            if($escaping) $jqueryui_format .= $php_format[$i]; 
            else $jqueryui_format .= '\'' . $php_format[$i]; 
            $escaping = true; 
        } 
        else 
        { 
            if($escaping) { $jqueryui_format .= "'"; $escaping = false; } 
            if(isset($SYMBOLS_MATCHING[$char])) 
                $jqueryui_format .= $SYMBOLS_MATCHING[$char]; 
            else 
                $jqueryui_format .= $char; 
        } 
    } 
    return $jqueryui_format; 
} 

Chức năng này xử lý tất cả các từ mã phổ biến giữa PHP và tiêu chuẩn định dạng ngày theo ngày.

Thêm vào đó, tôi đã thêm hỗ trợ cho nhân vật thoát:

d m \o\f Y trở thành dd mm 'of' yy

Bạn vẫn có thể có vấn đề với các biểu tượng như 'W', 'L' mà không có tương đương xử lý bởi datepicker.

+0

Cảm ơn bạn. Đây chính xác là những gì tôi cần. :) –

+1

Bạn được chào đón. ;-) Vui lòng trả lời câu trả lời này nếu bạn thấy nó hữu ích và có liên quan. –

+0

Đã làm bạn thân. :) –

4

Bạn không thể sử dụng cùng một định dạng với datepicker mà bạn đang sử dụng với PHP.

Vì định dạng ngày của PHP chỉ sử dụng mã chữ cái, bạn nên chỉ dùng định dạng ngày PHP và thay thế mỗi mã với giá trị tương ứng trong định dạng datepicker jQuery, ví dụ:

$PHPFormatOptions = array('y', 'Y', 'm', 'd'); 
$JSFormatOptions = array('yy', 'yyyy', 'mm', 'dd'); // and so on 
$JSFormat = str_replace($PHPFormatOptions, $JSFormatOptions, $PHPFormat); 
+0

Vì vậy, bạn tư vấn để tạo ra một loại từ điển phù hợp với từng biểu tượng với nhau? –

+1

Có, không có nhiều người trong số họ. – pilsetnieks

+0

Tôi hy vọng không có trường hợp mơ hồ. –

1

Không chắc Tôi khá với bạn, nhưng điều này thực sự không phải là một vấn đề. Bạn có thể nhập phân tích cú pháp đầu vào phía trước: sử dụng DateTime::createFromFormatcf. php documentation for this hoặc sử dụng JSON.
Vì JSON có cách thức tiêu chuẩn định dạng chuỗi ngày tháng được chấp nhận, bạn có thể chuyển một phiên bản JSON được xâu chuỗi của ngày nhập vào PHP và json_decode phía máy chủ. Cả hai giải pháp này đều mở cho bạn, mặc dù tôi tin rằng giải pháp đầu tiên sẽ dễ thực hiện hơn trong trường hợp của bạn.

Nếu bạn muốn để có thể chọn định dạng của cả hai bên, đối tượng DateTime chắc chắn là những gì bạn cần:

$date = new DateTime(); 
echo $date->format('Y-m-d').' <==> '.$date->format('y-M-j'); 
$postDate = $date->createFromFormat('y-m-d',$_POST['submitDate']); 
echo $postDate->format('Y-m-d'); 

Định dạng được giải thích trên trang tôi đã liên kết với.

+0

Tôi nghĩ rằng nó không phải về phân tích cú pháp đầu vào cho mỗi se, đó là về chuỗi định dạng ngày và chuyển đổi giữa chuỗi định dạng ngày của PHP và chuỗi định dạng ngày của jQuery, tức là giữa 'Y-m-d' và' yy-mm-dd'. – pilsetnieks

+0

Sau đó, tùy chọn đầu tiên là cách tốt nhất để đi, tôi sẽ chỉ thêm _look vào 'DateTime' object_ –

+0

Trong thực tế, tôi không có vấn đề với phân tích cú pháp một ngày từ một định dạng ngày nhất định. Đó là về việc Datepicker chấp nhận định dạng ngày tôi nhận được từ PHP. –

-3

Ok vì vậy giải pháp tốt nhất cho bạn là lưu trữ mọi thứ trong trang web của bạn bằng cách sử dụng time();

Theo như tôi biết datepicker thể được thiết lập để làm việc với tru để kiểm tra PHP timestamp

dateFormat : 'yy-mm-dd', 

Edit:

Tại sao bạn sẽ lưu trữ một ngày như: Y-m-d? Nó phải được lưu trữ dưới dạng dấu thời gian hoặc int

+0

không phải về việc chuyển đổi ngày tháng, cũng như lưu trữ ngày tháng. Tôi muốn trình chỉnh sửa ngày tháng có thể xử lý cùng một định dạng ngày tháng được hiển thị trên trang web. BUt cho bất kỳ tiêu chuẩn nào, đó là lý do tại sao tôi không thể làm nó khó. –

1

Dưới đây là giải pháp:

function datepicker_format($format) { 
     static $assoc = array(
      'Y' => 'yyyy', 
      'y' => 'yy', 
      'F' => 'MM', 
      'm' => 'mm', 
      'l' => 'DD', 
      'd' => 'dd', 
      'D' => 'D', 
      'j' => 'd', 
      'M' => 'M', 
      'n' => 'm', 
      'z' => 'o', 
      'N' => '', 
      'S' => '', 
      'w' => '', 
      'W' => '', 
      't' => '', 
      'L' => '', 
      'o' => '', 
      'a' => '', 
      'A' => '', 
      'B' => '', 
      'g' => '', 
      'G' => '', 
      'h' => '', 
      'H' => '', 
      'i' => '', 
      's' => '', 
      'u' => '' 
     ); 

     $keys = array_keys($assoc); 

     $indeces = array_map(function($index) { 
      return '{{' . $index . '}}'; 
     }, array_keys($keys)); 

     $format = str_replace($keys, $indeces, $format); 

     return str_replace($indeces, $assoc, $format); 
    } 

Sự kỳ diệu đôi str_replace gọi gây ra bằng cách nhân đôi trong kim và các giá trị thay thế của nó, vì vậy đó là lý do tại sao các chuỗi

m/d/Y 

trở thành

{{3}}/{{5}}/{{1}} 

và sau đó tổ này thay thế bằng các giá trị thay thế thực tế:

mm/dd/yy 
Các vấn đề liên quan