Hướng dẫn dùng denmark timezone trong PHP
Đôi lúc các bạn xem các hướng dẫn về hàm lấy thời gian :date(format,timestamp). Show Nếu chưa biết hàm date(format,timestamp) bạn có thể xem ở link:http://congnghe5s.com/bai-viet/xu-ly-ngay-gio-trong-php.html. Bạn thực hiện test lệnh trên máy và kết quả không khớp với time hiện tại. Đó là vì lí do thời gian hay timezone trên server bạn đã cài đặt khác vì thế để trả về đúng time bạn muốn bạn có thể dùng hàm: Cú pháp:date_default_timezone_set ( string tham số : $
date_default_timezone_set('Asia/Ho_Chi_Minh'). Sau đó các bạn dùng hàm : echo date('d/m/Y - H:i:s'); ra đúng kết quả time ở Việt Nam. Ví dụ: date_default_timezone_set('Asia/Ho_Chi_Minh'); if (date_default_timezone_get()) { echo 'date_default_timezone_set: ' . date_default_timezone_get() . ' '; } echo date('d/m/Y H:i:s'); Ví dụ trên có 1 hàm cũng khá quan trọng : date_default_timezone_get() trả về timezone mặc định của server bạn đang chạy hoặc là đã được thiết lập thông qua date_default_timezone_set(). Qua bài viết hy vọng các bạn có thêm kiến thức khi xử lý ngày tháng trong PHP. I live in Denmark - but am setting up a page for a friend in USA (Washington State). The page is hosted at Surftown, in Denmark. I know there is a 9 hour difference, so I set:
But there is something I obviously don't quite understand about time zones / Via text input I am trying to save a specific date and time to the database. Lets say that I then create a stamp using:
But when I try to output this, I get the correct date - but 9 hours is added to time? Why is this? I guess I could just remove the time zone setting for this specific task - but I'd like to understand why. I am setting the time zone because I also need to save some timestamps based on the actual time of the user (in Washington state - not Denmark). Can you help? Trong hướng dẫn này, chúng ta sẽ xem xét hai công cụ BDD khác nhau, Behat và phpspec, và xem chúng có thể hỗ trợ bạn như thế nào trong quá trình phát triển của bạn. Học BDD có thể gây nhầm lẫn. Phương pháp mới, công cụ mới và nhiều câu hỏi, chẳng hạn như "những gì cần kiểm tra?" và "công cụ nào để sử dụng?" Tôi hy vọng rằng ví dụ khá đơn giản này sẽ cung cấp cho bạn những ý tưởng về cách bạn có thể kết hợp BDD vào quy trình làm việc của riêng bạn. Nguồn cảm hứng của tôiTôi đã có cảm hứng để viết hướng dẫn này bởi Taylor Otwell, người tạo ra khung công tác Laravel. Một vài lần, tôi đã nghe Taylor giải thích lý do tại sao anh ta hầu như không làm TDD / BDD bằng cách nói rằng anh ấy thích đầu tiên lên kế hoạch API của mã của mình, trước khi thực sự bắt đầu thực hiện nó. Tôi đã nghe điều này từ nhiều nhà phát triển, và mỗi khi tôi nghĩ đến bản thân mình: "Nhưng đó là trường hợp sử dụng hoàn hảo cho TDD / BDD!". Taylor nói rằng anh thích lập bản đồ API của mã của mình, bằng cách viết mã mà anh mong muốn. Sau đó, anh ta sẽ bắt đầu viết mã và không hài lòng cho đến khi đạt được API chính xác đó. Lập luận có ý nghĩa nếu bạn chỉ kiểm tra / chỉ định ở cấp độ đơn vị, nhưng sử dụng một công cụ như Behat, bạn bắt đầu với hành vi bên ngoài của phần mềm, về cơ bản, theo như tôi hiểu, những gì Taylor muốn hoàn thành. Chúng tôi sẽ bao gồm những gìTrong hướng dẫn này, chúng tôi sẽ xây dựng một lớp trình tải tệp cấu hình đơn giản. Chúng tôi sẽ bắt đầu bằng cách sử dụng cách tiếp cận của Taylor và sau đó chuyển sang một phương pháp BDD thay thế. Các ví dụ là tối giản, nhưng chúng tôi vẫn sẽ phải lo lắng về đồ đạc, phương pháp tĩnh, vv, vì vậy tất cả-trong-tất cả, tôi nghĩ rằng họ nên là đủ để hiển thị như thế nào và phpspec có thể bổ sung cho nhau. Disclaimer: Trước hết, bài viết này không phải là một hướng dẫn bắt đầu. Nó giả định kiến thức cơ bản về BDD, Behat và phpspec. Bạn có thể đã xem xét các công cụ này, nhưng vẫn đang vật lộn với cách sử dụng chúng thực sự trong công việc hàng ngày của bạn. Nếu bạn muốn đánh dấu trên phpspec, hãy xem hướng dẫn bắt đầu của tôi. Thứ hai, tôi đang sử dụng Taylor Otwell làm ví dụ. Tôi không biết gì về cách Taylor làm việc, bên cạnh những gì tôi nghe anh ta nói trong podcast vv Tôi sử dụng anh ta làm ví dụ vì anh ấy là một nhà phát triển tuyệt vời (anh ấy đã tạo Laravel!) Và vì anh ấy nổi tiếng. Tôi cũng có thể đã sử dụng một người khác, vì hầu hết các nhà phát triển, bao gồm cả bản thân tôi, không làm BDD tất cả các thời gian, được nêu ra. Ngoài ra, tôi không nói rằng công việc Taylor mô tả là xấu. Tôi nghĩ rằng đó là một ý tưởng tuyệt vời để đưa một số suy nghĩ vào mã của bạn trước khi thực sự viết nó. Hướng dẫn này chỉ nhằm mục đích thể hiện cách BDD để thực hiện điều này. Luồng công việc của TaylorChúng ta hãy bắt đầu bằng cách xem Taylor có thể thiết kế bộ nạp tệp cấu hình này như thế nào. Taylor nói rằng anh thích chỉ tạo một tệp văn bản trống trong trình soạn thảo của mình và sau đó viết cách anh muốn các nhà phát triển có thể tương tác với mã của mình (API). Trong bối cảnh BDD, điều này thường được gọi là kiểm tra hành vi bên ngoài của phần mềm và các công cụ như Behat là điều tuyệt vời cho việc này. Chúng ta sẽ thấy điều này trong một thời gian ngắn. Đầu tiên, có thể Taylor sẽ đưa ra quyết định về các tệp cấu hình. Họ nên làm việc như thế nào? Như trong Laravel, chúng ta hãy sử dụng các mảng PHP đơn giản. Một tệp cấu hình ví dụ có thể trông giống như sau: # config.php 'UTC', ); Tiếp theo, mã nên sử dụng tệp cấu hình này hoạt động như thế nào? Hãy để chúng tôi làm điều này theo cách Taylor và chỉ viết mã mà chúng tôi mong muốn: $config = Config::load('config.php'); $config->get('timezone'); // returns 'UTC' $config->get('timezone', 'CET'); // returns 'CET' if 'timezone' is not configured $config->set('timezone', 'GMT'); $config->get('timezone'); // returns 'GMT' Được rồi, do đó, điều này có vẻ khá tốt. Đầu tiên chúng ta có một cuộc gọi tĩnh đến một hàm load (), tiếp theo là ba ca sử dụng:
Nó có ý nghĩa để sử dụng Behat cho những thứ này. Behat sẽ không ép buộc chúng tôi đưa ra bất kỳ quyết định thiết kế nào - chúng tôi có phpspec cho điều đó. Chúng tôi sẽ chỉ đơn giản là di chuyển các yêu cầu, mà chúng tôi vừa mô tả, thành một tính năng Behat để đảm bảo rằng chúng tôi làm đúng, khi chúng tôi bắt đầu xây dựng. Tính năng behat của chúng tôi sẽ phục vụ như là một thử nghiệm chấp nhận cho các yêu cầu của chúng tôi để nói chuyện. Nếu bạn nhìn vào mã chúng tôi đã viết, một lý do khác để sử dụng Behat, thay vì chỉ phpspec, là cuộc gọi tĩnh. Nó không phải là dễ dàng để thử nghiệm các phương pháp tĩnh, đặc biệt là không nếu bạn chỉ sử dụng một công cụ như phpspec. Chúng ta sẽ thấy làm thế nào chúng ta có thể đi về điều này khi chúng ta có cả Behat và phpspec. Thiết lậpGiả sử bạn đang sử dụng Composer, thiết lập Behat và phspec là một quá trình hai bước cực kỳ đơn giản. Trước tiên, bạn cần một tệp composer.json cơ bản. Điều này bao gồm Behat và phpspec, và sử dụng psr-4 để tự động tải các lớp: { "require-dev": { "behat/behat": "~3.0", "phpspec/phpspec": "~2.0" }, "autoload": { "psr-4": { "": "src/" } } } Chạy cài đặt trình soạn nhạc để tìm nạp các phụ thuộc. phpspec không cần bất kỳ cấu hình nào để chạy, trong khi Behat cần bạn chạy lệnh sau để tạo ra một giàn giáo cơ bản: $ vendor/bin/behat --init Đó là tất cả những gì mang theo. Điều này không thể là lý do của bạn vì không làm BDD! Lập kế hoạch các tính năng với BehatVì vậy, bây giờ chúng ta đã thiết lập xong, chúng ta đã sẵn sàng để bắt đầu thực hiện BDD. Vì BDD có nghĩa là cài đặt và sử dụng Behat và phpspec, phải không? Theo như tôi lo ngại, chúng tôi đã bắt đầu làm BDD. Chúng tôi đã mô tả hiệu quả hành vi bên ngoài của phần mềm của chúng tôi. "Khách hàng" của chúng tôi trong ví dụ này là các nhà phát triển, những người sẽ tương tác với mã của chúng tôi. Bởi "hiệu quả", tôi có nghĩa là chúng tôi đã mô tả hành vi theo cách họ sẽ hiểu. Chúng ta có thể lấy mã mà chúng ta đã phác thảo, đặt nó vào một tệp README, và mọi nhà phát triển PHP đều hiểu được việc sử dụng nó. Vì vậy, điều này là khá tốt thực sự, nhưng tôi có hai điều quan trọng cần lưu ý về điều này. Trước hết, mô tả hành vi của phần mềm sử dụng mã chỉ hoạt động trong ví dụ này bởi vì "khách hàng" là lập trình viên. Thông thường, chúng tôi đang thử nghiệm một cái gì đó sẽ được sử dụng bởi những người "bình thường". Một ngôn ngữ của con người là tốt hơn so với PHP khi chúng ta muốn giao tiếp với con người. Thứ hai, tại sao không tự động hóa điều này? Tôi sẽ không tranh luận tại sao điều này có thể là một ý tưởng hay. Điều đó đang được nói, tôi nghĩ rằng bắt đầu sử dụng Behat bây giờ sẽ là một quyết định hợp lý. Sử dụng Behat, chúng tôi muốn mô tả từng kịch bản mà chúng tôi đã nêu ở trên. Chúng tôi không muốn bao quát rộng rãi mọi trường hợp cạnh liên quan đến việc sử dụng phần mềm. Chúng tôi có phpspec có sẵn nếu điều này cần thiết để sửa lỗi trên đường đi, v.v. Tôi nghĩ rằng nhiều nhà phát triển, có thể bao gồm Taylor, cảm thấy như họ phải suy nghĩ mọi thứ qua và quyết định mọi thứ trước khi họ có thể viết các bài kiểm tra và thông số kỹ thuật. Đó là lý do tại sao họ chọn để bắt đầu mà không có BDD, bởi vì họ không muốn quyết định mọi thứ trước đó. Đây không phải là trường hợp với Behat, vì chúng ta đang mô tả hành vi và cách sử dụng bên ngoài. Để sử dụng Behat để mô tả một tính năng, chúng tôi không cần phải quyết định bất cứ điều gì nhiều hơn trong ví dụ trên bằng cách sử dụng một tập tin văn bản thô. Chúng tôi chỉ cần xác định các yêu cầu của tính năng - trong trường hợp này là API bên ngoài của lớp trình tải tệp cấu hình. Bây giờ, chúng ta hãy lấy mã PHP ở trên và biến nó thành một tính năng Behat, sử dụng ngôn ngữ tiếng Anh (thực sự sử dụng ngôn ngữ Gherkin). Tạo một tệp trong thư mục / feature, được gọi là config.feature và điền vào các trường hợp sau: Feature: Configuration files In order to configure my application As a developer I need to be able to store configuration options in a file Scenario: Getting a configured option Given there is a configuration file And the option 'timezone' is configured to 'UTC' When I load the configuration file Then I should get 'UTC' as 'timezone' option Scenario: Getting a non-configured option with a default value Given there is a configuration file And the option 'timezone' is not yet configured When I load the configuration file Then I should get default value 'CET' as 'timezone' option Scenario: Setting a configuration option Given there is a configuration file And the option 'timezone' is configured to 'UTC' When I load the configuration file And I set the 'timezone' configuration option to 'GMT' Then I should get 'GMT' as 'timezone' option Trong tính năng này, chúng tôi mô tả, từ bên ngoài, cách "nhà phát triển" có thể lưu trữ các tùy chọn cấu hình. Chúng tôi không quan tâm đến hành vi nội bộ - chúng tôi sẽ bắt đầu sử dụng phpspec. Miễn là tính năng này đang chạy màu xanh lá cây, chúng tôi không quan tâm những gì xảy ra đằng sau hậu trường. Hãy để chúng tôi chạy Behat và xem những gì nó nghĩ về tính năng của chúng tôi: $ vendor/bin/behat --dry-run --append-snippets Với lệnh này, chúng tôi yêu cầu Behat thêm các định nghĩa bước cần thiết vào ngữ cảnh tính năng của chúng tôi. Tôi sẽ không đi sâu vào chi tiết về Behat, nhưng điều này bổ sung thêm một loạt các phương thức trống vào lớp FeatureContext của chúng ta để ánh xạ tới các bước tính năng của chúng ta ở trên. Ví dụ, hãy xem định nghĩa bước mà Behat đã thêm cho có một bước tệp cấu hình mà chúng tôi sử dụng làm bước "Đã cho" trong cả ba trường hợp: /** * @Given there is a configuration file */ public function thereIsAConfigurationFile() { throw new PendingException(); } Bây giờ, tất cả những gì chúng ta phải làm là điền vào một số mã để mô tả điều này. Định nghĩa bước viếtTrước khi chúng tôi bắt đầu, tôi có hai điểm quan trọng để thực hiện về các định nghĩa bước:
Nếu bạn chạy vendor / bin / behat, bạn sẽ thấy rằng tất cả các kịch bản bây giờ có các bước đang chờ xử lý. Chúng ta bắt đầu với bước đầu tiên Do có một tệp cấu hình. Chúng ta sẽ sử dụng một fixture của file cấu hình, vì vậy chúng ta có thể sử dụng phương thức static load () sau này. Chúng ta quan tâm đến phương thức static load () vì nó cung cấp cho chúng ta một API Config :: load () tốt, giống như Laravel Facades. Bước này có thể được thực hiện theo nhiều cách. Bây giờ, tôi nghĩ chúng ta chỉ cần đảm bảo rằng chúng ta có sẵn fixture và nó chứa một mảng: /** * @Given there is a configuration file */ public function thereIsAConfigurationFile() { if ( ! file_exists('fixtures/config.php')) throw new Exception("File 'fixtures/config.php' not found"); $config = include 'fixtures/config.php'; if ( ! is_array($config)) throw new Exception("File 'fixtures/config.php' should contain an array"); } Chúng ta sẽ nhận được màu xanh lá cây với bước này mà không cần thực hiện bất kỳ mã nào ngoài việc thực hiện các trận đấu. Mục đích của bước Given là đặt hệ thống ở trạng thái đã biết. Trong trường hợp này, điều đó có nghĩa là đảm bảo chúng tôi có tệp cấu hình. Để đến bước xanh đầu tiên của chúng ta, chúng ta chỉ cần tạo ra vật cố định: # fixtures/config.php |