2015-05-19 17 views
9

Tôi đang lưu trữ dấu thời gian trong DB dưới dạng giá trị UTC, trong khi truy xuất lại dấu thời gian mà tôi cần để thực hiện theo thời gian UTC và cần chuyển đổi thành giá trị múi giờ cụ thể.làm cách nào để tìm dấu thời gian ngày là UTC

ví dụ: 2015/05/01 00: 09: 30: 00 UTC thời gian cần phải chuyển đổi để IST (Hoặc múi giờ khác)

resultSet.getDate("VisitDate") 

xin vui lòng giúp đỡ về vấn đề này.

Trả lời

1
private final static String DATEFORMAT = "yyyy-MM-dd HH:mm:ss"; 
public static String getCurrentTimeInUTC(){ 

    final SimpleDateFormat sdf = new SimpleDateFormat(DATEFORMAT); 
    sdf.setTimeZone(TimeZone.getTimeZone("UTC")); 
    final String utcTime = sdf.format(new Date()); 


    return utcTime; 

} 

U có thể thay đổi chuỗi UTC thành bất kỳ chuỗi múi giờ đã biết nào để nhận định dạng đó. Hãy bỏ phiếu nếu điều này hữu ích. cho việc thay đổi múi giờ bạn có thể sử dụng chức năng này

public static String getLocalTime(String timeZone) throws ParseException{ 
    DateFormat formatter = null; 
     Date convertedDate = null; 

     DateFormat outputFormat=new SimpleDateFormat(DATEFORMAT); 
     formatter = new SimpleDateFormat(DATEFORMAT); 
     formatter.setTimeZone(TimeZone.getTimeZone(timeZone)); 
     convertedDate = (Date) formatter.parse(getCurrentTimeInUTC()); 
     return outputFormat.format(convertedDate); 
} 

Thưởng thức :-)

+0

Bây giờ bạn có thể sử dụng chức năng thứ hai như trong dòng cuối cùng hai bạn có thể cho biết ngày UTC bạn cho chuyển đổi thêm. –

9

Java 8

Bạn có thể sử dụng một bộ ZonedDateTime để UTC và sau đó dịch nó vào một LocalDateTime sử dụng giống như. ..

java.sql.Timestamp ts = resultSet.getTimestamp("VisitDate"); 
ZonedDateTime utcDateTime = ZonedDateTime.ofInstant(ts.toInstant(), ZoneId.of("UTC")); 
LocalDateTime localDateTime = utcDateTime.withZoneSameInstant(ZoneId.systemDefault()).toLocalDateTime(); 

Rõ ràng, tôi đã sử dụng ZoneId.systemDefault() trong ví dụ này (chuyển đổi ngày/giờ được khoanh vùng thành địa phương) e/lần), nhưng bạn có thể vượt qua những gì từng khu vực bạn muốn/cần

Joda thời gian

Và tương tự với Joda thời gian nếu bạn không sử dụng Java 8

java.sql.Timestamp ts = resultSet.getTimestamp("VisitDate"); 
LocalDateTime utcDateTime = new LocalDateTime(ts, DateTimeZone.UTC); 
DateTime hereDateTime = utcDateTime.toDateTime(DateTimeZone.getDefault()); 
+0

Một điều không hoàn toàn đúng về điều này là nó giả định mặc định là 'Lịch' của db là UTC, nhưng có thể không phải như vậy. Trong ví dụ h2, 'Calendar' mặc định là' Calendar.getInstance() 'là lịch hệ thống. Điều mà người ta phải làm là 'ZoneId dbZoneId = ZoneId.of (" Europe/London "); Lịch dbCalendar = Calendar.getInstance (TimeZone.getTimeZone (dbZoneId)); TimeStamp ts = resultSet.getTimestamp ("VisitDate", dbCalendar); '. Sau đó, lệnh này sẽ truy xuất cá thể 'Dấu thời gian' bằng lịch đã được sử dụng để lưu trữ trường ở vị trí đầu tiên. –

+0

Chỉ cần làm rõ nhận xét trước của tôi. Điều này có thể trở nên rõ ràng nếu cơ sở dữ liệu h2 được tạo trong một vùng, sau đó được sao chép vào một máy tính trong vùng khác. Quá trình tạo dữ liệu đã lưu trữ nó với Anh 'Dấu thời gian', quá trình đọc sẽ mặc định đọc chúng như thể chúng là AU 'Dấu thời gian'. –

+0

@BrettRyan Đây là nơi có thời gian được lưu trữ trong một múi giờ được xác định tập trung là một ý tưởng hay: P – MadProgrammer

1

Như bạn nói trong khi lodaing vào DB bạn đang thiết như múi giờ UTC, Nhưng khi khi truy xuất các múi giờ trở lại từ DB nó không thể được tính theo giờ UTC một lần nữa như cửa hàng DB sẽ không thông tin múi giờ để biết thêm chi tiết kiểm liên kết này Dealing with Timezones in DB

vì vậy, theo đó nó có thể ret urn múi giờ của các thiết lập múi giờ JVM hoặc máy chủ DB cục bộ của bạn.

Dù sao để thay đổi múi giờ như đã đề cập trong câu trả lời khác mà bạn có thể sử dụng SimpleDateFormat

final SimpleDateFormat sdf = new SimpleDateFormat(DATEFORMAT); 
sdf.setTimeZone(TimeZone.getTimeZone("UTC")); 
final String utcTime = sdf.format(new Date()); 
Các vấn đề liên quan