การดึงวันที่/เวลาจาก Server ผ่านอินเทอร์เน็ต (ไม่ใช่เวลาระบบ)
ตัวอย่างนี้แสดงวิธีดึงเวลาปัจจุบันจากอินเทอร์เน็ต (แทนที่จะใช้เวลาระบบที่อาจไม่ถูกต้อง) หมายเหตุ: ตัวอย่างนี้ใช้ Calendar ของเครื่องจริงๆ การดึงจาก Server จริงต้องใช้ Network/API
ขั้นตอนที่ 1: สร้างโปรเจกต์ใหม่
Android Studio → File → New Project → กรอกรายละเอียด → Finish
ขั้นตอนที่ 2: Layout - res/layout/activity_main.xml
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="168dp" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textView"
android:layout_centerHorizontal="true"
android:layout_marginTop="36dp"
android:text="คลิกเพื่อดูวันที่และเวลาปัจจุบัน"
android:textColor="@color/colorPrimary" />
</RelativeLayout>
ขั้นตอนที่ 3: MainActivity.java
package app.com.sample;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
Calendar calendar;
SimpleDateFormat simpleDateFormat;
String date;
TextView displayDateTime;
Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
displayDateTime = findViewById(R.id.textView);
btn = findViewById(R.id.button);
calendar = Calendar.getInstance();
simpleDateFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
date = simpleDateFormat.format(calendar.getTime());
btn.setOnClickListener(v -> displayDateTime.setText(date));
}
}
ขั้นตอนที่ 4: AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="app.com.sample">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
⚠️ หมายเหตุสำคัญ: ตัวอย่างนี้ใช้เวลาระบบ (Calendar.getInstance())
โค้ดตัวอย่างนี้ ไม่ได้ดึงเวลาจากอินเทอร์เน็ตจริง แต่ใช้เวลาของอุปกรณ์ (System Time) หากต้องการเวลาจาก Server จริง ต้องใช้วิธีต่อไปนี้:
วิธีที่ 1: ใช้ NTP (Network Time Protocol)
// ต้องใช้ Library เช่น Apache Commons Net
// หรือ implement NTP client เอง (UDP port 123)
public class NTPClient {
public static Date getNetworkTime() throws Exception {
DatagramSocket socket = new DatagramSocket();
socket.setSoTimeout(5000);
InetAddress address = InetAddress.getByName("pool.ntp.org");
byte[] buffer = new byte[48];
buffer[0] = (byte) 0x1B; // LI=0, VN=3, Mode=3
DatagramPacket request = new DatagramPacket(buffer, buffer.length, address, 123);
socket.send(request);
DatagramPacket response = new DatagramPacket(buffer, buffer.length);
socket.receive(response);
socket.close();
// Parse NTP timestamp...
return new Date(transmitTime * 1000);
}
}
วิธีที่ 2: ใช้ HTTP Date Header (Simple)
// ใช้ OkHttp/Retrofit เรียก API ที่ส่ง Date header กลับมา
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://www.google.com")
.head() // HEAD request เล็กกว่า GET
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
String dateHeader = response.header("Date");
// Parse RFC 1123 date: "Mon, 01 Jan 2024 12:00:00 GMT"
SimpleDateFormat sdf = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US);
Date serverDate = sdf.parse(dateHeader);
// ใช้ serverDate
}
@Override
public void onFailure(Call call, IOException e) { }
});
วิธีที่ 3: ใช้ Time API Services
- World Time API:
https://worldtimeapi.org/api/timezone/Asia/Bangkok - TimezoneDB, Google Time Zone API
- คืนค่า JSON มี datetime, timezone, utc_offset
Best Practice สำหรับ Production
- Cache เวลาที่ดึงมา ใช้ offset คำนวณเวลาปัจจุบันแบบ Real-time
- Sync เป็นระยะ (เช่น ทุก 1 ชั่วโมง)
- Handle Error/Timeout ให้มี Fallback ไปใช้ System Time
- ใช้ Coroutines/RxJava สำหรับ Async Network Call
การทดสอบ
รันแอป → กดปุ่ม → แสดงวันที่/เวลาจาก Calendar ของเครื่อง (ไม่ใช่จาก Internet จริง)