2014-06-08 19 views
5

Khi tôi tạo hoặc cập nhật kỷ lục trên cánh buồm nó viết này tại updateAt:Làm thế nào để thiết lập múi giờ địa phương ở Sails.js hoặc Express.js

updatedAt: 2014-07-06T15:00:00.000Z 

nhưng tôi tại GMT + 2 giờ (trong mùa giải này) và cập nhật được thực hiện lúc 16:00.

Tôi có cùng một vấn đề với tất cả các trường datetime được khai báo trong các mô hình của tôi.

Tôi làm cách nào để đặt múi giờ đúng trên Sails (hoặc cuối cùng là Express)?

+0

đặt thời gian cục bộ trên máy chủ nơi các công trình ứng dụng của bạn. Không phải nó? – diproart

Trả lời

1

Cố gắng giải quyết vấn đề của bạn bằng cách đặt múi giờ trên máy chủ của bạn hơi bị nhìn thấy một chút. Nếu bạn di chuyển thì sao? Hoặc ai đó ở một quốc gia khác truy cập vào ứng dụng của bạn? Điều quan trọng là dấu thời gian trong cơ sở dữ liệu của bạn có múi giờ được mã hóa trong chúng, do đó bạn có thể dịch sang đúng thời điểm ở mặt trước. Tức là, nếu bạn làm như vậy:

new Date('2014-07-06T15:00:00.000Z') 

trong bảng điều khiển trình duyệt, bạn sẽ thấy nó hiển thị ngày và giờ chính xác cho dù bạn ở đâu. Các cánh buồm tự động mã hóa dấu thời gian này cho bạn với các trường updatedAtcreatedAt mặc định; chỉ cần đảm bảo bạn luôn sử dụng múi giờ khi lưu bất kỳ dấu thời gian tùy chỉnh nào vào cơ sở dữ liệu và bạn sẽ ổn thôi!

0

Tôi đã hiểu rằng không đặt múi giờ ở cấp ứng dụng (tôi thấy lý do các tác giả buồm đã làm theo cách đó), tuy nhiên tôi đã có thời gian khó khăn khi thực hiện truy vấn đối sánh ngày đơn giản. Tôi giả định rằng nếu bạn tạo một bản ghi bằng cách sử dụng các phương thức kế hoạch chi tiết mặc định (phương thức này có chứa trường datetime thêm trên các giá trị mặc định), chuyển vào một ngày, bạn có thể chuyển vào cùng một ngày trong truy vấn nhận được và có được bản ghi tương tự.

Ví dụ: giả sử trường datetime được gọi là "specialdate". Nếu tôi tạo một kỷ lục mới thông qua api với "specialdate" bằng "06-09-2014" (bỏ qua thời gian), tôi đã không thể chạy truy vấn tìm kiếm mà tôi có thể chuyển vào "06-09-2014" và lấy lại bản ghi đó. Lớn hơn các truy vấn hoạt động tốt (nếu tôi tìm kiếm một ngày lớn hơn). Tôi chắc chắn đó là một điều bù đắp múi giờ, nhưng đã không thể đưa ra một giải pháp.

2

tôi đã giải quyết được vấn đề, bạn nên thiết lập các tùy chọn tập tin MySql để thay đổi múi giờ UTC trong config/connections.js thiết lập tại

devMysqlServer: { 
    adapter: 'sails-mysql', 
    host: '127.0.0.1', 
    user: 'root', 
    password: '***', 
    database: '**', 
    timezone: 'utc' 
    }, 
1

Quy hoạch kiến ​​trúc tốt nhất ở đây, IMO, là để tiếp tục sử dụng định dạng isoDate Sails.js. Khi bạn tải trang web/ứng dụng của bạn, isoDate sẽ được chuyển đổi thành múi giờ của trình duyệt/ứng dụng khách thường được đặt ở cấp hệ điều hành.

Dưới đây là ví dụ bạn có thể thử nghiệm điều này. Mở bảng điều khiển trình duyệt và chạy new Date().toISOString() và xem thời gian được đặt. Nó sẽ được dựa trên các thông số kỹ thuật cho isoDate 8601 (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString). Bây giờ, hãy thay đổi thời gian hệ thống của bạn thành múi giờ khác hoặc chỉ cần thay đổi giờ của bạn vào thời gian đó và lưu (bạn không phải tải lại nếu bạn đang sử dụng bảng điều khiển chrome). Chạy lệnh của bạn trong giao diện điều khiển một lần nữa new Date().toISOString() và bạn sẽ nhận được một thời gian điều chỉnh thích hợp với thời gian bạn vừa thay đổi.

Nếu bạn muốn tiếp tục chứng minh cho mình thời gian Sails.js phù hợp để sử dụng, hãy sử dụng Moment.js trên isoDate được lưu trữ trong cơ sở dữ liệu của bạn (được tạo bởi đường nước ORM) như vậy moment("2016-02-05T22:36:48.800Z").fromNow() và bạn ' sẽ nhận thấy thời gian liên quan đến thời gian hệ thống của bạn.

7

Con đường tôi xử lý các vấn đề sau giờ làm nghiên cứu:

Đặt process.env.TZ = 'UTC'; //whatever timezone you want

trong config/bootstrap.js

+0

Làm việc của nó khi tôi đang chạy trên env phát triển, nhưng nó không làm việc trong sản xuất env – Arshad

+0

này là một giải pháp hoàn hảo làm việc cho tôi. –

Các vấn đề liên quan