Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Android

วิธีดึงวันที่และเวลาจากอินเทอร์เน็ตใน Android

การดึงวันที่/เวลาจาก 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 จริง)